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不起作用。为什么会这样?受保护的和公共成员应该被继承。
答案 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); }