我可以在Java中公开受保护的成员吗?我想从一个子类访问它

我可以在Java中公开受保护的成员吗?我想从一个子类访问它,java,class,public,protected,Java,Class,Public,Protected,我不熟悉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

我不熟悉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,然后回到以前的状态。或者我可以成为一名能手/二传手。但我认为可以理解的是,内部结构是可以接受的,并且它应该能够扩展其他类。

编译器的信息相当清楚-在B中,您实际上得到了:

这失败了,因为C中没有无参数的构造函数可以调用。要么引入一个无参数构造函数,要么在B中提供一个显式构造函数,用适当的参数调用C中的构造函数

我不确定拥有所有这些非私有字段是不是一个好主意,请注意——B中的字段隐藏C中的字段也不是一个好主意。您真的希望B的实例有两个x字段和两个y字段吗?你意识到他们将是分开的领域,不是吗

如果您只想有效地提供公共访问,您可以:

public void setX(int x) {
    this.x = x;
}

public int getX() {
    return x;
}

y也一样,从B中删除额外的字段。但是,在C中,您不能更改字段的实际可访问性。

编译器消息相当清楚-在B中,您实际上得到了:

这失败了,因为C中没有无参数的构造函数可以调用。要么引入一个无参数构造函数,要么在B中提供一个显式构造函数,用适当的参数调用C中的构造函数

我不确定拥有所有这些非私有字段是不是一个好主意,请注意——B中的字段隐藏C中的字段也不是一个好主意。您真的希望B的实例有两个x字段和两个y字段吗?你意识到他们将是分开的领域,不是吗

如果您只想有效地提供公共访问,您可以:

public void setX(int x) {
    this.x = x;
}

public int getX() {
    return x;
}

y也一样,从B中删除额外的字段。但是,你不能更改C中字段的实际可访问性。

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

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

哇,感谢3^10 m/s的响应,速度很快。。。我刚刚发现我需要一个受保护的默认值constructor@Skeet:是否确实希望B的实例具有两个x字段和两个y字段?你意识到他们将是分开的领域,不是吗?不,我不明白你说的分开字段是什么意思?当我调用超类C中的sum时,它会起作用吗?@天朔:不会,sum会对C中声明的字段求和,与B中声明的字段完全分离。我也应该指出,产品和金额可能最好是返回值而不是将其设置在另一个字段中。我认为我需要的是像C++中的朋友类。这在Java中可能吗?哇,太快了,感谢3^10 m/s的响应。。。我刚刚发现我需要一个受保护的默认值constructor@Skeet:是否确实希望B的实例具有两个x字段和两个y字段?你意识到他们将是分开的领域,不是吗?不,我不明白你说的分开字段是什么意思?当我调用超类C中的sum时,它会起作用吗?@天朔:不会,sum会对C中声明的字段求和,与B中声明的字段完全分离。我也应该指出,产品和金额可能最好是返回值而不是将其设置在另一个字段中。我认为我需要的是像C++中的朋友类。这在Java中是可能的吗?伙计,你只能发布一个问题的答案,然后发布给我们答案是有效的。你可以像我一样在你自己的问题上加上评论。阅读常见问题。老兄,你只能发布一个问题的答案,然后发布给我们这个答案有效。你可以像我一样在你自己的问题上加上评论。阅读常见问题。