在Java中,无法从子类访问超类的受保护成员

时间:2012-01-11 11:41:18

标签: java inheritance

class Super {
   protected int a;
   protected Super(int a) { this.a = a; }
}

class Sub extends Super {
    public Sub(int a) { super(a); }
    public Sub() { this.a = 5; }
}




  public Sub() { this.a = 5; }  

this.a = 5不起作用。为什么会这样?受保护的和公共成员应该被继承。

3 个答案:

答案 0 :(得分:9)

问题不是你访问变量,而是你没有调用基础构造函数:

class Super {
   protected int a;
   protected Super(int a) { this.a = a; }
}

class Sub extends Super {
    public Sub(int a) { super(a); }
    public Sub() { 
       super(0);  // <-- call base constructor
       this.a = 5; 
    }
}

这是因为您没有为Super定义默认构造函数,因此如果您没有指定构造函数,派生类就不知道要调用哪个构造函数。

答案 1 :(得分:0)

Sub中的无参数构造函数试图隐式调用Super中不存在的无参数构造函数,这是(我假设)为什么会出现编译错误。

答案 2 :(得分:0)

什么不起作用?对我有用......

您没有的是默认构造函数 - 在public Sub() {this.a = 5; }中调用父默认构造函数,您尚未提供。如果我编译你的代码我得到:

cannot find symbol constructor Super()

所以你要么必须有一个默认的构造函数,要么执行:public Sub() { super(5); }