1

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

  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!!
        }
    

    }

非常感谢任何帮助...

谢谢,肖恩。

4

2 回答 2

2

因为C在另一个包中,并且您正在创建一个,A不是A.

将问题翻转过来:为什么它应该是可见的?您已经知道打包规则,并且您已经知道字段访问规则。

于 2013-02-06T17:27:15.800 回答
1

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

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

于 2013-02-06T17:30:12.297 回答