1

我是 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,并回到我之前的状态。或者我可以做一个getter/setter。但我认为内部结构是可以接受的,它应该能够扩展其他类是可以理解的。

4

2 回答 2

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 中字段的实际可访问性。

于 2010-02-04T09:48:54.017 回答
0

好的,我在弄乱自己的代码,发现问题是我需要超类 C 的受保护的默认构造函数。它现在可以工作了……

于 2010-02-04T09:49:59.330 回答