我是Java和OOP的新手,
我在A类中使用了一个私有子类(实际上是一个结构)B,一切顺利,直到我决定为子类B创建一个父类C.我想公开C类的一些受保护成员。
例如:
public class A {
private class B extends C {
public int product;
public int x;
public int y;
public void add() {
product=x+y;
}
}
B b=new B;
b.x=1;
b.y=2;
b.multiply();
System.out.println(b.product+"="+b.x+"x"+b.y);
public class C {
protected int x;
protected int y;
public int sum;
public C(px,py) {
x=px;
y=py;
}
public void sum() {
sum=x+y;
}
}
我得到了
默认构造函数未定义隐式超级构造函数C()。 必须定义显式构造函数
当然,我可以删除扩展C,然后回到之前的状态。或者我可以做一个吸气剂/二传手。但我认为内部结构是可以接受的是可以理解的,它应该能够扩展其他类。
答案 0 :(得分:5)
编译器消息相当清楚 - 在B中你有效得到了:
public B() {
super();
}
然后失败,因为C中没有无参数构造函数来调用。引入无参数构造函数,或在B中提供显式构造函数,使用适当的参数调用C中的构造函数。
我不确定拥有所有这些非私人字段是个好主意,请注意 - B中的字段隐藏C中的字段也不是一个好主意。你真的想要B的实例有两个x
字段和两个y
字段?你意识到他们将是独立的领域,不是吗?
如果您只想有效地提供公共访问权限,您可以:
public void setX(int x) {
this.x = x;
}
public int getX() {
return x;
}
(和y
相同)并从B中删除多余的字段。但是,您无法更改C中字段的实际可访问性。
答案 1 :(得分:0)
好吧,我正在使用我自己的代码,发现问题是我需要一个超类C的受保护的默认构造函数。它现在有效......