【问题标题】:c++ like protected in java [duplicate]c++ like protected in java [重复]
【发布时间】:2012-06-06 19:35:01
【问题描述】:

可能重复:
How to make data member accessible to class and subclass only

在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 的 fun(),即使 B 不是 A 的子类。

如何使所有不是 A 子类的类都无法访问 A?

编辑:: 我想在java中实现这一点。

【问题讨论】:

标签: java c++ protected access-specifier


【解决方案1】:

在java中没有办法做到这一点。受保护意味着对同一包中的继承者和类可见。但是您可以密封您的包 (http://docs.oracle.com/javase/tutorial/deployment/jar/sealman.html),这样任何人都不能在您的包中创建新的类。

【讨论】:

    【解决方案2】:

    在 Java 中,protected 的意思是“继承者和同一包中的其他人可以访问。”

    在 C++ 中,protected 的意思是“继承者可以访问”。

    由于 Java 中的包可访问性,它们并不真正等效。

    在 Java 中模仿 C++ 保护的唯一方法是在自己的包中声明类,但我不建议这样做。

    【讨论】:

      【解决方案3】:

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

      也就是说,您(理想情况下)控制包中的所有代码,因此您只需要确保自己不使用它。

      【讨论】:

      • 只是好奇,有没有什么机制可以阻止其他人在你的包中简单地声明他们的代码?
      • @matts 请参阅 Polygnome 的回答。您可以密封您的 jar 以防止在您的包中声明新类。
      • 据报道,docs.oracle.com/javase/tutorial/deployment/jar/sealman.html 有效。但是反射允许任何代码绕过可见性限制,如private 或受保护:实际上没有办法阻止想要获取内部变量的代码。所以...基本上,你无法阻止它的发生,只会让它变得更加困难,protected 就是这样做的。
      • @LouisWasserman 好吧,您可以添加一个 SecurityManager 来阻止该访问。但在几乎所有情况下,这都太过分了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多