使用对象时的受保护访问

时间:2013-02-06 17:24:36

标签: java object member protected

我理解受保护的访问意味着可以访问包中的成员和任何子类,而不管包是什么。我发现难以理解的是,在子类中,当我创建具有受保护成员的类的对象时,我得到“不可见”错误? 以下代码(基于YiFan Wu的答案的扩展版本)证明了这一点。请注意,我在包内外都有相同的代码行。因此,我有两个问题:

  1. 为什么使用该对象会改变一切?
  2. 在包中不会发生此对象访问差异,即参见A1类中的test()。

    package a;
    public class A{
        protected int a;
    }
    class A1{
        public void test(){
            A ref = new A();
            ref.a=8;    // no issue
        }
    }
    
    package b;
    public class B extends A{
    }
    
    package c;
    public class C extends B{
        public void accessField(){
            a = 2;   //That works.
    
    
            A ref = new A();
            ref.a=8;   // not visible!!
        }
    

    }

  3. 任何帮助都非常感谢...

    谢谢, 肖恩。

2 个答案:

答案 0 :(得分:2)

由于C位于另一个包中,并且您正在创建A不是 A的子类。

翻开问题:为什么应该可见?您已经知道打包规则,并且您已经知道了字段访问规则。

答案 1 :(得分:1)

在最后一种情况下,您正在创建一个A对象的新实例。这与使用子类的实例访问其父类的成员完全不同。

创建子类时,它首先创建父类。唯一可以访问父实例中受保护成员的子类是创建父类的子类。