【问题标题】:A protected class member can be accessed just like a public class member in Java可以像 Java 中的公共类成员一样访问受保护的类成员
【发布时间】:2011-12-25 08:37:42
【问题描述】:

按照约定,Java 中的protected 类成员只能从声明它的类中或从它的直接后代继承类中访问。以下示例中的 protected 类成员,但是可以在不使用 Java 中的任何继承概念的情况下从其他类访问。​​

package classmembers;

final class Demo
{
    private int a=10;
    protected int b=20;
    public int c=30;

    public Demo(int a, int b, int c)
    {
        this.a=a;
        this.b=b;
        this.c=c;
    }

    protected void show()
    {
        System.out.println("a = "+a);
    }
}

final public class Main
{
    public static void main(String[] args)
    {
        Demo d=new Demo(10, 20, 30);

        //System.out.print("\n"+d.a);    Wrong, since a has private access

        d.show(); //Working, even if it is protected

        System.out.print("\n"+d.b);  //Working, even if it is protected

        System.out.print("\n"+d.c);  //Working, since it is public, obviously
    }
}

在本例中,protected 类成员 b 类型为 int 和方法 show() 在类 Demo 中声明 是通过 main() 方法访问的,即使它们被显式声明为 protected 并且没有使用任何继承概念。


在这种情况下,Java 中受保护的类成员和公共类成员有什么区别。他们是一样的吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    这是因为受保护的成员也可以从同一个包中的类访问。 (MainDemo 都在 classmembers 包中。)

    在这种情况下,Java 中受保护的类成员和公共类成员有什么区别。它们是一样的吗?

    仅当类属于不同的包时,修饰符才会有所不同。

    请看官方教程中的表格:Controlling Access to Members of a Class

    Modifier        Class    Package    Subclass     World
    ------------------------------------------------------
    public            Y        Y            Y          Y  <---.
                                                              |---- difference!
    protected         Y        Y            Y          N  <---'
                              ---
    
    no modifier       Y        Y            N          N
    private           Y        N            N          N
    

    【讨论】:

      【解决方案2】:

      protected 修饰符确保 package-private 访问。如需更多信息,请参阅Controlling Access to Members of a Class

      【讨论】:

        【解决方案3】:

        protected 也可以被同一个包中的类访问。这就是您的示例有效的原因。

        尝试使用不同包中的 main 创建一个类,您将无法访问。

        问候

        【讨论】:

          猜你喜欢
          • 2018-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-01
          • 2016-10-01
          • 1970-01-01
          相关资源
          最近更新 更多