《Java程序设计教程》第三章习题

  1. 请简述接口和抽象类之间的区别。

    若类修饰词列表中含有关键字 abstract,则该类具有抽象属性,称为抽象类。

    接口总是具有抽象属性,不管接口修饰词列表中是否含有关键字 abstract。

  2. 请简述面向对象语言的3个基本属性及其作用。

    3 个基本属性:继承性、多态性、封装性。

    作用:

    1. 继承性:实现软件可重用性的一种重要手段,使得当前定义的类可以继承其父类或所实现接口的成员域或成员方法。
    2. 多态性:也是实现软件可重用性的手段之一,使得继承特性更为灵活,并使程序具有良好的可扩展性。
    3. 封装性:使得各个模块(对象)的外在表现仅仅为对一些成员域的访问方式和一些成员方法的调用方式,即屏蔽各个模块(对象)的内部具体实现方式。
  3. 请简述匿名内部类的特点。

    不具有类名,不能具有抽象和静态属性,并且不能派生出子类。

  4. 指出下面程序的错误之处,并说明理由。

    class J_Class {
        public static int mb_square(int x) {
            return (x*x);
        }
        
        public static double mb_square(int y) {
            double d = y;
            return (d*d);
        }
    }
    

    两个 mb_square 成员方法冲突;方法名相同,参数个数相同,对应参数类型也相同,Java 虚拟机无法区分这两个成员方法。

  5. 指出下面各个程序段的错误之处(可能不止一处),说明理由,并给出相应的正确程序。

    (1)

    int mb_divide(int x, int y) {
        int result;
        if(y == 0)
            result = 0;
        else
            result = x/y;
    } // 方法 mb_divide 结束
    

    缺少返回语句;该方法返回值类型为 int,不为空。

    int mb_divide(int x, int y) {
        int result;
        if(y == 0)
            result = 0;
        else
            result = x/y;
        return result;
    } // 方法 mb_divide 结束
    

    (2)

    void mb_output(int x); {
        System.out.println(x);
    } // 方法 mb_output 结束
    

    语法错误;方法头后面的分号应去掉。

    void mb_output(int x) {
        System.out.println(x);
    } // 方法 mb_output 结束
    

    (3)

    void mb_outputSquare(int x) {
        System.out.println("x=" + x);
        void mb_square(int x) {
            System.out.println("x*x=" + (x*x));
        } // 方法 mb_square 结束
    } // 方法 mb_outputSquare 结束
    

    方法不能嵌套。

    void mb_outputSquare(int x) {
        System.out.println("x=" + x);
        mb_square(x);
    } // 方法 mb_outputSquare 结束
    
    void mb_square(int x) {
        System.out.println("x*x=" + (x*x));
    } // 方法 mb_square 结束
    

    (4)

    void mb_fun(int x) {
        System.out.println("x=" + x);
        int x = x*x;
        System.out.println("x*x=" + x);
        {
            int x = x*x*x;
            System.out.println("x*x*x=" + x);
        }
    }
    

    新定义的局部变量 x 与形式参数 x 重名。

    void mb_fun(int x) {
        System.out.println("x=" + x);
        int y = x*x;
        System.out.println("x*x=" + y);
        {
            int z = x*x*x;
            System.out.println("x*x*x=" + z);
        }
    }
    
  6. 编写一个程序:给定一个整数,在控制台窗口中分别输出这个整数的补码形式的二进制数、八进制数和十六进制数。

    public class J_Integer {
        public static void conversion(int x) {
            converse(x, 2);
            converse(x, 8);
            converse(x, 16);
        }
    
        public static void converse(int x, int p) {
            if(p == 2) {
                System.out.print("Bin: " + (x < 0 ? "-" : ""));
                for(int j = 31; j >= 0; --j) {
                    System.out.print((x>>j)&1);
                }
                System.out.println();
            }
            else if(p == 8) {
                System.out.print("Oct: " + (x < 0 ? "-" : ""));
                for(int j = 32; j >= 0; j -= 3) {
                    System.out.print(((x>>j)&1)* 4 + ((x>>(j-1))&1)* 2 + ((x>>(j-2))&1));
                }
                System.out.println();
            }
            else if(p == 16) {
                System.out.print("Hex: " + (x < 0 ? "-" : ""));
                for(int j = 31; j >= 0; j -= 4) {
                    int sum = ((x>>j)&1)* 8 + ((x>>(j-1))&1)* 4 + ((x>>(j-2))&1) * 2 + ((x>>(j-3))&1);
                    System.out.print(sum >= 10 ? sum-10+'A' : sum);
                }
                System.out.println();
            }
        }
    }
    
  7. 编写一个程序:给定一个正整数,判断它是否为素数,并输出判断结果。

    public class J_Integer {
        public static boolean isprime(int x) {
            if(x == 1) return false;
            for(int i = 2; i*i <= x; ++i)
                if(x % i == 0)
                    return false;
            return true;
        }
    }
    
  8. 编写一个程序:给定 3 个整数 a、b 和 c,要求在控制台输出方程 a x 2 + b x + c = 0 ax^2+bx+c=0 的根。

    public class J_Equation {
        public static void printRoot(int a, int b, int c) {
            System.out.print(((-b+Math.sqrt(b*b-4*a*c))/(2*a)) + " " + ((-b-Math.sqrt(b*b-4*a*c))/(2*a)));
        }
    }
    
  9. 请设计一个软件包。要求该软件包含三角形类、正方形类、圆类和正五边形类。每个类都要求具有构造方法,而且可以构造任意的一般图形。例如:要求通过三角形类的构造方法可以创建在任意位置上的一般三角形。要求每个类都含有计算该图形的周长的成员方法和计算该图形的面积的成员方法。然后编写一个程序,分别创建这些类的实例对象,并输出这些实例对象的周长和面积。在创建这些实例对象时,构造方法的调用参数值可以自行设计。

    // J_Shape.java
    public interface J_Shape {
        public abstract double mb_getPerimeter();
        public abstract double mb_getArea();
    }
    
    // J_Triangle.java
    import sun.nio.cs.ext.MacHebrew;
    
    public class J_Triangle implements J_Shape{
        public double m1_x, m1_y, m2_x, m2_y, m3_x, m3_y;
    
        public J_Triangle(double x1, double y1, double x2, double y2, double x3, double y3) {
            m1_x = x1; m1_y = y1;
            m2_x = x2; m2_y = y2;
            m3_x = x3; m3_y = y3;
        }
    
        public double mb_getPerimeter() {
            return Math.sqrt((m1_x-m2_x)*(m1_x-m2_x) + (m1_y-m2_y)*(m1_y-m2_y)) +
                    Math.sqrt((m2_x-m3_x)*(m2_x-m3_x) + (m2_y-m3_y)*(m2_y-m3_y)) +
                    Math.sqrt((m1_x-m3_x)*(m1_x-m3_x) + (m1_y-m3_y)*(m1_y-m3_y));
        }
    
        public double mb_getArea() {
            double dx1 = m2_x-m1_x, dy1 = m2_y-m1_y;
            double dx2 = m3_x-m1_x, dy2 = m3_y-m1_y;
            return 0.5 * Math.abs(dx1*dy2 - dx2*dy1);
        }
    }
    
    // J_Square.java
    public class J_Square implements J_Shape {
        public double m_minX, m_minY;
        public double m_maxX, m_maxY;
        public double sideLen;
    
        public J_Square(double x1, double y1, double x2, double y2) {
            if(x1 < x2) {
                m_minX = x1;
                m_maxX = x2;
            }
            else {
                m_minX = x2;
                m_maxX = x1;
            }
            if(y1 < y2) {
                m_minY = y1;
                m_maxY = y2;
            }
            else {
                m_minY = y2;
                m_minY = y1;
            }
            sideLen = Math.sqrt((m_minX-m_maxX)*(m_minX-m_maxX) + (m_minY-m_maxY)*(m_minY-m_maxY)) / Math.sqrt(2);
        }
    
        public double mb_getPerimeter() {
            return 4 * sideLen;
        }
    
        public double mb_getArea() {
            return sideLen * sideLen;
        }
    }
    
    // J_Circle.java
    public class J_Circle implements J_Shape {
        public double m_x, m_y;
        public double m_radius;
    
        public J_Circle(double x, double y, double r) {
            m_x = x;
            m_y = y;
            m_radius = r;
        }
    
        public double mb_getPerimeter() {
            return 2 * Math.PI * m_radius;
        }
    
        public double mb_getArea() {
            return Math.PI * m_radius * m_radius;
        }
    }
    
    // J_Pentagon.java
    public class J_Pentagon implements J_Shape {
        public double m_x, m_y;
        public double m_radius, m_sideLen;
    
        public J_Pentagon(double x, double y, double r, double d) {
            m_x = x; m_y = y;
            m_radius = r; m_sideLen = d;
        }
    
        public double mb_getPerimeter() {
            return 5 * m_sideLen;
        }
    
        public double mb_getArea() {
            return 5 * 0.5 * m_sideLen * Math.sqrt(m_radius*m_sideLen - m_sideLen*m_sideLen/4);
        }
    }
    
    // J_Test.java
    public class J_Test {
        public static void main(String[] args) {
            J_Shape a = new J_Triangle(0, 0, 0, 1, 1, 0);
            System.out.println("三角形:x1 = 0, y1 = 0, x2 = 0, y2 = 1, x3 = 1, y3 = 0");
            System.out.println("周长:" + a.mb_getPerimeter());
            System.out.println("面积:" + a.mb_getArea());
            a = new J_Square(0,  0, 1, 1);
            System.out.println("正方形:x1 = 0, y1 = 0, x2 = 1, y2 = 1");
            System.out.println("周长:" + a.mb_getPerimeter());
            System.out.println("面积:" + a.mb_getArea());
            a = new J_Circle(0, 0, 1);
            System.out.println("圆形:x = 0, y = 0, r = 1");
            System.out.println("周长:" + a.mb_getPerimeter());
            System.out.println("面积:" + a.mb_getArea());
            a = new J_Pentagon(0, 0, 3, 3);
            System.out.println("圆形:x = 0, y = 0, r = 3, d = 3");
            System.out.println("周长:" + a.mb_getPerimeter());
            System.out.println("面积:" + a.mb_getArea());
        }
    }
    
    // Output
    三角形:x1 = 0, y1 = 0, x2 = 0, y2 = 1, x3 = 1, y3 = 0
    周长:3.414213562373095
    面积:0.5
    正方形:x1 = 0, y1 = 0, x2 = 1, y2 = 1
    周长:4.0
    面积:1.0
    圆形:x = 0, y = 0, r = 1
    周长:6.283185307179586
    面积:3.141592653589793
    圆形:x = 0, y = 0, r = 3, d = 3
    周长:15.0
    面积:19.48557158514987
    
  10. 趣味思考题:请通过编程求解如下孙膑和庞涓问题。

    庞涓拿到两个整数(这两个整数均在 2~99 之间)之和,孙膑拿到这两个整数之积。下面是一段很有趣的对话。

    庞涓说:我不知道这两个整数是多少,但我肯定你也不知道。

    孙膑说:我本来不知道这两个整数是多少。但既然你这么说,那我现在知道了。

    庞涓说:哦,那我也知道了。

    要求输出所有可能的结果,包括这两个整数、这两个整数之和以及这两个整数之积。

    作业帮

猜你喜欢

转载自blog.csdn.net/ShadowBurn/article/details/86986996