【问题标题】:protected access when using objects使用对象时受保护的访问
【发布时间】:2013-01-22 00:09:42
【问题描述】:

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

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

    }

非常感谢任何帮助...

谢谢, 肖恩。

【问题讨论】:

    标签: java object member protected


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      因为C 在另一个包中,而您正在创建一个A不是A 的子类。

      换个问题:为什么应该它是可见的?你已经知道打包规则了,你也已经知道了字段访问规则。

      【讨论】:

      • 事实上这是编译器的懒惰:如果你做了C ref = new C();,你就可以访问ref(我猜)。许多人批评了这一点。
      • 嗨,戴夫,第一行确实解释了这一点。我的困惑出现了,因为我希望能够在子类中访问受保护的成员(无论包如何)。但是,正如您所解释的,一旦进入不同的包,只有子类可以访问,因此我需要创建子类的对象(或在子类本身的方法中)......非常感谢,肖恩。
      猜你喜欢
      • 1970-01-01
      • 2019-10-06
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多