Java中类似于C++的protected关键字

11

可能重复:
如何使数据成员仅对类和子类可见

在Java中,
受保护的成员可以从该类内部、它的子类以及与该类在同一个包中的所有类中访问,
但我想要一个成员只能从该类及其子类中访问(就像C++中的受保护成员一样)。

例如:

class A
{
    protected void fun()
    {
        System.out.println("Hello");
    }
}
class B
{
    public static void main(String args[])
    {
        A a = new A();
        a.fun();        
    }
}

在这里,即使B不是A的子类,A的fun()也对B可访问。

如何使得所有非A子类的类都无法访问A?

编辑:我想在Java中实现这个目标。


这可能很有用 - https://dev59.com/Q0nSa4cB1Zd3GeqPPZqR - FSP
3个回答

9

在Java中,没有办法做到这一点。

话虽如此,你(理想情况下)控制你包中的所有代码,所以你只需要确保你自己不使用它。


只是好奇,有没有机制可以防止其他人在您的程序包中简单地声明他们的代码? - matts
1
@matts 请查看Polygnome的回答。您可以封装您的jar文件,以防止在您的包中声明新类。 - Mesop
2
据报道,http://docs.oracle.com/javase/tutorial/deployment/jar/sealman.html 是有效的。但是反射允许任何代码绕过可见性限制,如“private”或“protected”:实际上没有办法阻止想要获取您内部变量的代码。因此...基本上,您无法阻止它发生,只能使其更加困难,而“protected”可以做到这一点。 - Louis Wasserman
@LouisWasserman 嗯,你可以添加一个SecurityManager来防止这种访问。但在几乎所有情况下,那会显得过于严格了。 - Jochen

3

2
在Java中,“protected”表示“可以被继承者和同一包中的其他对象访问”。
在C++中,“protected”表示“可以被继承者访问”。
它们并不完全等价,因为Java中存在包的可访问性。
要在Java中模拟C++保护,唯一的方法是将类声明为其自己的包,但我不建议这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接