Question 150
Given:
1. class Super {
2. private int a;
3. protected Super(int a) { this.a = a; }
4. }
.....
11. class Sub extends Super {
12. public Sub(int a) { super(a); }
13. public Sub() { this.a= 5; }
14. }
Which two, independently, will allow Sub to compile? (Choose two.)
A. Change line 2 to:
public int a;
B. Change line 2 to:
protected int a;
C. Change line 13 to:
public Sub() { this(5); }
D. Change line 13 to:
public Sub() { super(5); }
E. Change line 13 to:
public Sub() { super(a); }
Answer: CD我认为答案是A、B、C、D
Given:
1. class Super {
2. private int a;
3. protected Super(int a) { this.a = a; }
4. }
.....
11. class Sub extends Super {
12. public Sub(int a) { super(a); }
13. public Sub() { this.a= 5; }
14. }
Which two, independently, will allow Sub to compile? (Choose two.)
A. Change line 2 to:
public int a;
B. Change line 2 to:
protected int a;
C. Change line 13 to:
public Sub() { this(5); }
D. Change line 13 to:
public Sub() { super(5); }
E. Change line 13 to:
public Sub() { super(a); }
Answer: CD我认为答案是A、B、C、D
首先去找它父类的无参的构造方法,但是父类没有无参的构造方法
我每个选择都试了一遍,编译时报的错误如下:
1.子类不可以访问父类的私有成员(原题)
2.子类继承父类不能超过父类的范围(Q1、Q2)
3.无法在调用父类型构造函数之前引用a(Q5)
完整的调用过程如下:1. public Sub() {
2. super(); // 注意首字母s小写,super是关键字
3. this.a = 5;
4. }当把父类的成员变量a变成公有或保护类型后,第3行
this.a = 5;
不会再报错,但第2行
super();
仍会报错,因为编译器仍然找不到父类的无参构造器,即Super()构造方法。1楼cweijiaweil的论述是正确的。
A和B不对,报Implicit super constructor Super() is undefined. Must explicitly invoke another constructor
这题涉及继承中两个知识点,一是继承时成员作用域,二是继承时构造法的调用。
题中代码最重要的错误在13行,A、B只改变了a的作用域,无法“independently”解决现有错误。
子类构造必须调用父类或自身重载的构造,如果没有显示(super(a)、this(a))调用,默认调用父类无参构造。
我觉得你还是理解错了,super()是调用超类的无参构造函数,而这道题中超类却没有无参构造函数,所以要子类中不能调用super(),这道题中13. public Sub() { this.a= 5; }隐式的调用了super(),这是错误1,而且a在超类中是private的 子类没有继承,13行中的this.a= 5是错误2.
A 和 B答案仅仅解决了错误2 没有解决错误1,无法“independently”解决所有错误,所以仅仅选C D
你的意思我理解,我说的是针对super()和this()的理解,不是针对这题!
因为在之前很多题都出现过,所以我就总结一下,父类如果有带参数的构造函数,而子类的构造函数中又必须super(参数)或者this()或者this(参数),如果要使用super(),则必须要在父类中构造无参构造函数,系统不会自动加上。对于this(),是针对子类本身的,也必须有无参构造函数,而this(参数),子类中就必须要有带参数的构造函数。但是对于子类有一点,有了this()、this(参数),就不能有super()、super(参数)!
这就是用到自身的构造函数public Sub(int a) { super(a); },就不会再去调用父类的构造函数super(a)了!
其实归根结底还是要调父类构造的,因为this()无论怎么调来调去,至少有一个是要调父类的某个构造。
子类的每个构造方法都要直接或者间接、显式或隐式的调用父类的构造方法。不显式的调用super(.....)或者this(.....)的话,就是在调用参数相同的构造方法,例如Sub(String s)默认是在此方法的第一行调用super(s)。注意:super(....)和this(.....)只能出现在构造方法的第一行。
另外,在super(.....)和this(....)调用的时候,只能传入参数、常量或者静态成员变量,调用静态方法,而不能使用任何实例成员。