7.Java语言接口间的继承关系是( B )。 A.单继承 B.多重继承 C.不能继承 D.不一定 【解析】Java语言接口间的继承关系允许多重继承。 8.一个类实现接口的情况是( A )。 A.一次可以实现多个接口 B.一次只能实现一个接口 C.不能实现接口 D.不一定 【解析】Java语言允许一个类一次实现多个接口。 9.定义外部类的类头时,不可用的关键字是( C )。 A.public B.final C.protected D.abstract 【解析】定义外部类时不能使用protected关键字。
10.如果局部变量和成员变量同名,如何在局部变量作用域内引用成员变量?( B )
A.不能引用,必须改名,使它们的名称不相同 B.在成员变量前加this,使用this访问该成员变量 C.在成员变量前加super,使用super访问该成员变量 D.不影响,系统可以自己区分 【解析】this可以用来引用本类对象。 11.下面说法不正确的是( B )。
A.抽象类既可以做父类,也可以做子类 B.abstract和final能同时修饰一个类
C.抽象类中可以没有抽象方法,有抽象方法的类一定是抽象类或接口 D.声明为final类型的方法不能在其子类中重新定义
【解析】abstract和final不能同时修饰一个类,因为abstract类需要子类,而final类不能有子类。
二、填空题
1.消息就是向对象发出 服务请求 ,是对 数据成员 和 成员方法 的引用。 2.在面向对象系统中,消息分为两类 公有消息 和 私有消息 。
3.在面向对象程序设计中,采用 继承 机制可以有效地组织程序结构。充分利用已有的类
来创建更复杂的类,大大提高程序开发的效率,提高代码的复用率,降低维护的工作量。 4. 数据成员的隐藏 是指在子类中重新定义一个与父类中已定义的数据成员名完全相同的数据成员。
5.子类可以重新定义与父类同名的成员方法,实现对父类方法的 覆盖 。 6.子类在重新定义父类已有的方法时,应保持与父类完全相同的 方法名 、 返回值类型 和
参数列表 ,否则就不是方法的覆盖,而是子类定义自己特有的方法,与父类的方法无关。 7.this代表了 当前对象 的一个引用,super表示的是当前对象的 直接父类对象 的引用。 8.抽象类不能 创建 对象,该工作由抽象类派生的非抽象子类来实现。
9.如果父类中已有同名的abstract方法,则子类中就 不能 (能/不能)再有同名的抽象
方法。
10.abstract类中不能有 private 访问权限的数据成员或成员方法。
11. interface 是声明接口的关键字,可以把它看成一个特殊类。接口中的数据成员默认的
修饰符是 public static final ,接口中的成员方法默认的修饰符是 public abstract 。 12.如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须 实现 该接口的
所有抽象方法;如果实现某接口的类是abstract的抽象类,则它可以 不实现 该接口所有的方法。但是对于这个抽象类任何一个非抽象的子类而言,它们父类所实现的接口
25
中的所有抽象方法以及自身所实现接口中的抽象方法都必须有实在的 方法体 。 13.包的作用有两个,一是 划分类名空间 ,二是 控制类之间的访问 。
14.封装也称 信息隐藏 ,是指类的设计者只为类的使用者提供类的可以访问的部分(包
括类的数据成员和成员方法),而把类中的其他成员 隐藏 起来,使用户不能访问的机制。
15.Java提供了4种访问权限来实现封装机制,即 private 、 protected 、 默认 和 public 。 16.Java中提供两种多态机制, 重载 与 覆盖 。
17.当一个构造方法需要调用另一个构造方法时,可以使用关键字 this ,同时这个调用语
句应该是整个构造方法的 第一条 可执行语句。
18.如果子类自己没有构造方法,那么父类也一定 没有 (有/没有)带参的构造方法,此
时它将继承父类的 无参构造方法 作为自己的构造方法;如果子类自己定义了构造方法,则在创建新对象时,它将先执行 父类 的构造方法,然后再执行自己的 构造方法 。 19.对于父类的含参数构造方法,子类可以通过在自己的构造方法中使用 super 关键字来调用它,但这个调用语句必须是子类构造方法的 第一条 可执行语句。
20.创建一个名为myPackage的包的语句为 package myPackage; ,该语句应该放在程序第一行 位置。 三、编程题
1.编写一个实现方法重载的程序。
【编程分析】重载的含义就是在一个类中定义多个具有相同方法名,不同参数列表的方法。在下面程序中的类中定义了三个同名方法area,分别用于求圆、矩形和三角形的面积。三个方法具有不同的参数。 【参考程序】
public class X5_3_1{ public double area(double radius){ return Math.PI*radius*radius; } public double area(double width, double height){ return width*height; } public double area(double a, double b, double c){ double s = (a+b+c)/2; return Math.sqrt(s*(s-a)*(s-b)*(s-c)); } public static void main(String[] args){ X5_3_1 shape = new X5_3_1(); System.out.println(\ System.out.println(\ System.out.println(\ } }
【运行结果】
The area of circle is: 314.1592653589793 The area of rectangle is: 200.0
26
The area of triangle is: 72.61843774138907 2.编写一个实现方法覆盖的程序。
【编程分析】方法覆盖是指在子类中重新定义了父类中的方法。本例中在Shape类、Circle类、Cylinder类中都定义了area方法,而且Cylinder类继承了Circle类、Circle类继承了Shape类,从而实现了area方法的覆盖。 【参考程序】
abstract class Shape { abstract protected double area(); }
class Circle extends Shape{ float r;
public Circle(float a) { r=a; }
public double area(){ System.out.print(\ \ return Math.PI*r*r; } }
class Cylinder extends Circle { float h;
public Cylinder(float a,float b) { super(a); h=b; }
public double area() { System.out.print(\ \ return 2*Math.PI*r*r+2*Math.PI*r*h; } }
public class EX5_3_2 { public static void main(String args[]) { Circle cl=new Circle(3); Cylinder cd=new Cylinder(2,5); System.out.println(cl.area()); System.out.println(cd.area()); } }
【运行结果】
Calculate the area of circle: 28.274333882308138 Calculate the area of cylinder: 87.96459430051421 3.编写一个实现数据成员隐藏的程序。 【编程分析】数据成员的隐藏是指子类和父类都有一个相同的数据成员,当子类对象调用该数据成员时,默认调用子类的该成员,而不是父类的该成员,相当于隐藏了父类的该成员。
27
本例中Hide类中定义了数据成员x,该类的子类X_5_3_3中也定义了数据成员x,当子类对象调用x时,调用的是子类的x,而不是父类的x。 【参考程序】
public class X5_3_3 extends Hide { int x = 200; public static void main(String args[]) { X5_3_3 obj = new X5_3_3 (); System.out.println(\// 数据成员的隐藏 } }
class Hide{ int x = 100; }
【运行结果】
x = 200
4.编写一个使用this和super关键字的程序。
【编程分析】this关键字表示当前对象本身,而super关键字则是当前对象的直接父类对象。本例程序中定义了两个类X1和X2,其中都定义了成员变量x、y。此时就需要区分父类与子类的成员变量,采用super引用父类的成员变量和方法。
注意:父类和子类中都定义了show()方法,如果没有特别指定,则是调用当前类的方法。 【参考程序】
public class X5_3_4{ public static void main(String[] args){ X2 x = new X2(5); x.setY(); x.show(); System.out.println(\// 输出父类数据成员y System.out.println(\ // 输出子类数据成员y } }
class X1{ int x,y; X1(int i){ x=i; y=x*2; } int getY(){ return y; } void show(){ System.out.println(\ } }
class X2 extends X1{
28