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

Posted

技术标签:

【中文标题】我可以在 Java 中公开受保护的成员吗?我想从子类访问它【英文标题】:Can I make a protected member public in Java? I want to access it from a subclass 【发布时间】:2011-01-13 00:10:16 【问题描述】:

我是 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。但我认为内部结构是可以接受的,它应该能够扩展其他类是可以理解的。

【问题讨论】:

【参考方案1】:

编译器消息相当清楚 - 在 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 中字段的实际可访问性。

【讨论】:

哇,这真是太快了,感谢 3^10 m/s 的响应......我刚刚发现我需要一个受保护的默认构造函数 @Skeet:你真的希望 B 的实例有两个 x 字段和两个 y 字段吗?你意识到它们将是不同的领域,不是吗?不,我不明白你说的他们分开的领域是什么意思?当我调用超类 C 中的 sum() 时它会起作用吗? @TiansHUo: 不,sum() 将对 C 中声明的字段进行求和,这些字段与 B 中声明的字段完全分开。(我还应该指出,product()sum() 会可能最好返回该值而不是将其设置在另一个字段中。) 我认为我需要的是类似朋友类的东西(比如在 C++ 中)。这在 Java 中可行吗?【参考方案2】:

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

【讨论】:

老兄,您只能发布问题的答案,然后向我们发布答案有效。您可以像我对您自己的问题所做的那样添加评论。阅读常见问题解答。

以上是关于我可以在 Java 中公开受保护的成员吗?我想从子类访问它的主要内容,如果未能解决你的问题,请参考以下文章

Python - 访问类的受保护成员_

类的高级概念

Java中public,private,protected,和默认的区别

[20-05-21][Class Notes 10]Java OO 10

Python中的“受保护”访问 - 如何?

在 Java 中,公开对象的成员是否一个坏主意?