问题描述
我观察到 protected
个成员的一些奇怪的(对我而言)行为。
也就是说,我当然了解 package-private
和 protected
之间的主要区别,即 package-private
+ 从子类访问,不考虑后者的包。
虽然,我已经观察到:
- ✓
protected
超类的成员,可以通过继承在子类中访问(就像将成员定义到子类中一样); - ✓
protected
超类的成员,可通过子类实例访问(但只能在子类范围内,而不是在在其他地方创建的子类实例); - X
protected
超类的成员,通过在子类中创建的超类实例不可访问;但是,如果受保护的成员是static
,那么它可以在超类和子类定义上访问,并且可以在任何地方访问(在子类实例上访问受保护的实例成员时,在子类本身之外,情况并非如此) .
我知道,这一切读起来可能有点乱,但这也是我现在的感觉 - 一团糟。我以为我已经了解了 protected
修饰符的所有深层细节,但似乎有些事情让我有点困惑。
package com.package1;
public class SuperClass {
protected void protectedMethod() {
}
protected static void staticProtectedMethod() {
}
}
package com.package2;
import com.package1.SuperClass;
public class SubClass extends SuperClass {
public static void subClassstaticmethod() {
staticProtectedMethod(); //OK
}
public void subClassInstanceMethod() {
protectedMethod(); //inheritance,compiles OK
new SubClass().protectedMethod(); //Compiles OK
//but
new SuperClass().protectedMethod(); //Does NOT compile..
//although with respect to static protected members,both work fine:
SuperClass.staticProtectedMethod(); //OK
SubClass.staticProtectedMethod(); //OK
}
}
请澄清一下?
为什么语言设计限制了对超类的受保护成员访问?
为什么 static
成员表现出不同的行为并允许在子类和超类上访问受保护的成员?
为什么不能在子类之外的子类上访问受保护的成员?
我对 protected
访问修饰符的理解缺少什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)