使用对象时受保护的访问

Posted

技术标签:

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

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

    为什么使用对象会改变一切?

    此对象访问差异不会发生在包内,即参见 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!!
        
    

非常感谢任何帮助...

谢谢, 肖恩。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

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

以上是关于使用对象时受保护的访问的主要内容,如果未能解决你的问题,请参考以下文章

玩Web虎-运行时受保护文件不可复制

为啥我们不能在 Kotlin 的 Singleton 类(对象)中使用受保护的访问修饰符

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

通过查询模式通过子对象访问父对象的受保护字段

在类的构造函数上使用受保护的访问修饰符

访问同一类的另一个对象的受保护属性的方法