4 继承与接口
4.1 继承概念
下列关于继承的哪项叙述是正确的?
A. 在java中允许多重继承
B. 在java中一个类只能实现一个接口
C. 在java中一个类不能同时继承一个类和实现一个接口
D. java的单一继承使代码更可靠
解决方案
D
给出下面代码:
1 2 3 4 5 6 7 8 9 10 11 12 | 1) class Parent { 2) private String name; 3) public Parent(){} 4) } 5) public class Child extends Parent { 6) private String department; 7) public Child() {} 8) public String getValue() { return name; } 9) public static void main (String arg[]) { 10) Parent p = new Parent(); 11) } 12) } |
哪些代码行将引起错误?
A. 第3行
B. 第6行
C. 第7行
D. 第8行
解决方案
D
设有下面两个类的定义:
1 2 3 4 5 6 7 8 9 | class Person { class Student extends Person { long id; // 身份证号 int score; // 入学总分 String name; // 姓名 int getScore(){ return score; } } } |
类Person和类Student的关系是:
A. 包含关系
B. 继承关系(内部类继承了外部类)
C. 关联关系
D. 无关系,上述类定义有语法错误
解决方案
B
构造方法不能被继承。
A. 正确
B. 错误
解决方案
A
一个子类可以重新定义从父类那里继承来的同名方法,而且允许它们有不同的返回值类型。
A. 正确
B. 错误
解决方案
B
4.2 成员变量/方法
看下面一段程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Aclass{ void go(){ System.out.println("Aclass"); } } public class Bclass extends Aclass{ void go(){ System.out.println("Bclass"); } public static void main(String args[]){ Aclass a=new Aclass(); Aclass a1=new Bclass(); a.go(); a1.go(); } } |
以上程序运行结果是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | A. Aclass Aclass B. Bclass Bclass C. Aclass Bclass D. Bclass Aclass |
解决方案
C
在Java中,以下关于方法重载和方法重定义描述正确的是?
A. 方法重载和方法的重定义实现的功能相同
B. 方法重载出现在父子关系中,方法重定义是在同一类中
C. 方法重载的返回值类型必须一致,参数项必须不同
D. 方法重定义的返回值类型必须相同或相容。
解决方案
D
方法的覆盖是在子类中再次实现父类中已经实现过的方法。
A. 正确
B. 错误
解决方案
A
可以用final说明变量为一个常量。
A. 正确
B. 错误
解决方案
A
被final修饰符修饰的类,不能被继承。
A. 正确
B. 错误
解决方案
A
最终类不能派生子类,但最终方法可以被覆盖。
A. 正确
B. 错误
解决方案
B
4.3 super关键字
如果子类要初始化父类的类变量,调用super语句必须:
A. 放在子类构造方法第一条语句
B. 放在子类构造方法任何位置
C. 可以采用初始化列表方式执行
D. 可以调用this关键字
解决方案
A
this和super都可以在main()方法中使用
A. 正确
B. 错误
解决方案
B
4.4 上转型对象
考虑以下两个类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class UpByOne { private int num = 0; public int getNum () { return num; } public void setNum (int x) { num = x; } public void up () { num = num + 1; } } class UpByTwo extends UpByOne { public void up () { // missing code goes here } } |
在类UpByTwo中,重定义方法方法up(),使得num加2,以下哪段代码最合适填补省掉的代码?
A. num = num + 2;
B. super.up(); super.up();
C. setNum(getNum()) + 2;
D. super.up() + 1;
解决方案
B
假设类BaseWidget是类TypeAWidget的父类,并且在类TypeAWidget中重写了方法speak(),那么下列哪个程序片段能正确编译执行?
A. Object A=new BaseWidget(); A.speak();
B. BaseWidget B=new TypeAWidget(); B.speak();
C. TypeAWidget C=new BaseWidget();
D. speak();
解决方案
B
上转型对象可以调用子类中基类被覆盖的方法。
A. 正确
B. 错误
解决方案
A
上转型对象可以调用子类中新的方法。
A. 正确
B. 错误
解决方案
B
Java语言里的上转型对象也即是所谓的父类给子类对象赋值而已
A. 正确
B. 错误
解决方案
B
Java不允许上转型对象再重新给子类对象赋值。
A. 正确
B. 错误
解决方案
B
4.5 抽象类
编译及运行以下代码,下列选项哪个是正确的?
1 2 3 4 5 6 7 8 9 10 11 | abstract class MineBase { abstract void amethod(); static int i; } public class Mine extends MineBase { public static void main(String argv[]){ int[] ar=new int[5]; for(i=0;i < ar.length;i++) System.out.println(ar[i]); } } |
B. Error: ar is used before it is initialized
C. Error Mine must be declared abstract
D. IndexOutOfBoundes Error
解决方案
C
含有抽象方法的类必须声明为抽象类。
A. 正确
B. 错误
解决方案
A
抽象类可以用来定义对象,也可以被继承。
A. 正确
B. 错误
解决方案
B
一个抽象类中的所有方法都必须是抽象的。
A. 正确
B. 错误
解决方案
B
4.6 接口
interface可以被以下哪个修饰符修饰?
A. private
B. class
C. public
D. static
解决方案
C
关于接口的定义和实现,以下描述正确的是:
A. 接口定义的方法只有实现
B. 接口中的变量默认是public、final和static的
C. 如果一个接口由多个类来实现,则这些类在实现该接口中的方法时采用统一的代码
D. 如果一个类实现了接口,则必须实现该接口中的所有方法,但方法可不为public
解决方案
B
关于接口下面不正确的说法是:
A. 接口不支持多重继承
B. 接口所有方法是抽象的
C. 接口里的方法访问属性均为public
D. 实现接口的关键字是implements
解决方案
A
一个类只能继承单个父类,一个类只能实现一个接口。
A. 正确
B. 错误
解决方案
B
接口不能声明构造函数。
A. 正确
B. 错误
解决方案
A
4.7 接口回调
给定以下程序片段,结果为?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | interface InterfaceA{ String s="Hello"; void f(); } class ClassA implements InterfaceA{ public void f(){ System.out.print(s); } } class ClassB{ void g(InterfaceA a){ a.f(); } } public class E { public static void main(String[] args) { ClassB b=new ClassB(); b.g(new ClassA()); } } |
B. 编译正确,但无运行结果
C. 编译错误:b.g(new ClassA())
D. 以上都不对
解决方案
A
给定如下程序,运行结果为:
1 2 3 4 5 6 7 8 9 10 11 12 | interface B{ void f(); } class A implements B{ public void f(){ System.out.println("I love java!"); } public static void main(String[] args) { B b=new A(); b.f(); } } |
B. I love java!
C. 编译错误
D. 以上都不对
解决方案
B
给出如下程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | interface InterfaceA{ String s="good "; void f(); } abstract class ClassA{ abstract void g(); } class ClassB extends ClassA implements InterfaceA{ void g(){ System.out.print(s); } public void f(){ System.out.print(" "+s); } } public class E { public static void main(String[] args) { ClassA a=new ClassB(); InterfaceA b=new ClassB(); a.g(); b.f(); } } |
其运行结果是?
A. 编译正确,但无运行结果
B. 编译错误:InterfaceA b=new ClassB();
C. good good
D. 以上都不对
解决方案
C