使用对象时受保护的访问
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
(我猜)。许多人批评了这一点。
嗨,戴夫,第一行确实解释了这一点。我的困惑出现了,因为我希望能够在子类中访问受保护的成员(无论包如何)。但是,正如您所解释的,一旦进入不同的包,只有子类可以访问,因此我需要创建子类的对象(或在子类本身的方法中)......非常感谢,肖恩。以上是关于使用对象时受保护的访问的主要内容,如果未能解决你的问题,请参考以下文章
为啥我们不能在 Kotlin 的 Singleton 类(对象)中使用受保护的访问修饰符