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能讲解一下答案选CD的理由吗??

解决方案 »

  1.   

    private  a
    C this(5)隐士调用protected Super(int a)
      

  2.   

    D 的super(5)也是调用super的构造函数。
      

  3.   

    为什么隐士调用protected Super(int a)就可以成功编译呢???
      能讲讲理由吗???
      

  4.   

    A. 改为public后,由于父类有显示定义的构造函数,子类调用构造函数时,也一定要显示调用父类构造,所以编译不过
    B. 与A同理
    E. 父类的私有在子类中不可见
      

  5.   


    它不是隐式调用的public Sub() { this(5); }
    public Sub(int a) { super(a); }
    protected Super(int a) { this.a = a; }是这样依次调用的: this(5)调用本身的 Sub(5) 然后才是 super(5)
      

  6.   

    因为:class Sub extends Super 所以Sub具有Super的所有性质,虽然严格地定义一变量,但是Super的子类还是可以重写它的这个方法
    这个就是继承的方法调用:通过继承子类自动拥有了基类的所有成员变量和方法……
      

  7.   

    A,B不可以是因为生成一个子类对象要先调用父类的构造函数,无论是用public还是protected,当你用Sub sub=new Sub()生成子类对象时,要调用父类的无参构造函数,但父类没有无参构造函数,所以报错,C中this(5)会调用public Sub(int a) { super(a); }这个构造函数,正确,D中super(5)调用父类的有参构造函数,正确,至于E,a是父类私有变量,子类自然不能访问,但我把a改成公有的依然报错cannot reference a before supertype constructor has been called,应该是在父类构造函数访问前不能引用a