我找到了一些含糊不清的恕我直言。假设我们有以下类结构:
public class A
{
private int privateVar = 1;
protected int protectedVar = 2;
static class B extends A
{
public int getPrivateVariable()
{
return privateVar; //error: Cannot make a static reference to the non-static field memberVariable
}
public int getProtectedVariable()
{
return protectedVar; //OK: Why?
}
public int getPrivateUnfair()
{
return super.privateVar; //Why this can be accessed using super which the protected member doesn't require.
}
}
}
protected
和private
变量的访问方式有所不同?但是,如果嵌套类是非静态内部类,那么情况并非如此?super
允许访问封闭类型的私有成员?答案 0 :(得分:4)
- 为什么静态嵌套类可以自由访问实例成员?
醇>
因为B extends A
。您未访问A
的成员变量,您正在访问B
的继承成员变量。
- 为什么保护和私有变量的访问方式有所不同?但是,如果嵌套类是非静态内部类,那么情况并非如此?
醇>
因为私有字段不是继承的,而受保护的字段是;但私有字段仍然存在于超类中,并且可以通过super
显示,因为B
嵌套在A
中。可见性修饰符不足以表达与通过超级访问相同的内容。
答案 1 :(得分:3)
为什么静态嵌套类可以自由访问实例成员?
嵌套类可以访问同一外部类中的所有私有成员。它们都是一次编译的,并且添加了访问器方法以允许这样做。注意:hte JVM不允许这样的访问,这就是需要添加访问器方法的原因。
为什么保护和私有变量的访问方式有所不同?
假设受保护的成员通过超类访问,因为它们是继承的。私有字段不是继承的,但可以访问嵌套类。