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

解决方案 »

  1.   

    既public Sub() { this.a= 5; } 
    首先去找它父类的无参的构造方法,但是父类没有无参的构造方法
      

  2.   

    ls说法有问题。
    我每个选择都试了一遍,编译时报的错误如下:
    1.子类不可以访问父类的私有成员(原题)
    2.子类继承父类不能超过父类的范围(Q1、Q2)
    3.无法在调用父类型构造函数之前引用a(Q5)
      

  3.   

    public Sub() { this.a= 5; } 这行代码会隐含调用super();
    完整的调用过程如下:1. public Sub() {
    2.    super(); // 注意首字母s小写,super是关键字
    3.    this.a = 5;
    4. }当把父类的成员变量a变成公有或保护类型后,第3行
    this.a = 5; 
    不会再报错,但第2行
    super();
    仍会报错,因为编译器仍然找不到父类的无参构造器,即Super()构造方法。1楼cweijiaweil的论述是正确的。
      

  4.   

    正解.
    A和B不对,报Implicit super constructor Super() is undefined. Must explicitly invoke another constructor
      

  5.   

    1L、2L的说法是正确的。
    这题涉及继承中两个知识点,一是继承时成员作用域,二是继承时构造法的调用。
    题中代码最重要的错误在13行,A、B只改变了a的作用域,无法“independently”解决现有错误。
    子类构造必须调用父类或自身重载的构造,如果没有显示(super(a)、this(a))调用,默认调用父类无参构造。
      

  6.   

    谢谢大家的讲解,已经明白了!对于子类的中构造方法,必须super();调用父类的构造方法,或者this();调用自己的构造方法,但是有this()调用时就不能有super();这是我对super()和this()的理解!
      

  7.   


    我觉得你还是理解错了,super()是调用超类的无参构造函数,而这道题中超类却没有无参构造函数,所以要子类中不能调用super(),这道题中13. public Sub() { this.a= 5; }隐式的调用了super(),这是错误1,而且a在超类中是private的 子类没有继承,13行中的this.a= 5是错误2.
    A 和 B答案仅仅解决了错误2 没有解决错误1,无法“independently”解决所有错误,所以仅仅选C D
      

  8.   

    public Sub() { this(5); }  this(5) 又是怎么回事?
      

  9.   


    你的意思我理解,我说的是针对super()和this()的理解,不是针对这题!
    因为在之前很多题都出现过,所以我就总结一下,父类如果有带参数的构造函数,而子类的构造函数中又必须super(参数)或者this()或者this(参数),如果要使用super(),则必须要在父类中构造无参构造函数,系统不会自动加上。对于this(),是针对子类本身的,也必须有无参构造函数,而this(参数),子类中就必须要有带参数的构造函数。但是对于子类有一点,有了this()、this(参数),就不能有super()、super(参数)!
      

  10.   


    这就是用到自身的构造函数public Sub(int a) { super(a); },就不会再去调用父类的构造函数super(a)了!
      

  11.   


    其实归根结底还是要调父类构造的,因为this()无论怎么调来调去,至少有一个是要调父类的某个构造。
      

  12.   

    15楼说的很清楚。
    子类的每个构造方法都要直接或者间接、显式或隐式的调用父类的构造方法。不显式的调用super(.....)或者this(.....)的话,就是在调用参数相同的构造方法,例如Sub(String s)默认是在此方法的第一行调用super(s)。注意:super(....)和this(.....)只能出现在构造方法的第一行。
    另外,在super(.....)和this(....)调用的时候,只能传入参数、常量或者静态成员变量,调用静态方法,而不能使用任何实例成员。