【问题标题】:Regarding access to private member of outer class关于访问外部类的私有成员
【发布时间】:2015-09-29 07:51:15
【问题描述】:
成员内部类可以访问其外部类的成员(甚至是私有成员)。但是,方法中包含的本地内部类没有。
为什么?
给我的一个原因是,对于 JVM,没有内部类的概念,它为每个内部类创建顶级类,这就是为什么它们不应该访问私有成员,但对于两者来说仍然应该是正确的时间。
此外,本地内部类实际上可以访问最终成员。为什么会这样?
【问题讨论】:
标签:
java
oop
inner-classes
【解决方案1】:
这是一个全面的例子,什么是可访问的,什么是不可访问的:
public class Outer {
private static String staticOuterField;
private String outerField;
public void method() {
class MethodInner {
public void methodInnerMethod() {
System.out.println(staticOuterField); // OK
System.out.println(outerField); // OK
}
}
}
public static void staticMethod() {
class StaticMethodInner {
public void staticMethodInnerMethod() {
System.out.println(staticOuterField); // OK
System.out.println(outerField); // Not accessible
}
}
}
static class StaticInner {
public void staticInnerMethod() {
System.out.println(staticOuterField); // OK
System.out.println(outerField); // Not accessible
}
}
class Inner {
public void innerMethod() {
System.out.println(staticOuterField); // OK
System.out.println(outerField); // OK
}
}
}
外部静态字段始终可以从内部类访问。仅当内部类绑定到外部实例时,外部实例字段才可访问。如果内部类是非静态内部类或在实例方法中声明的类,就会出现这种情况。
内部类背后的整个想法是它们可以完全访问外部类成员,也包括私有成员。这使得它们与应用一般访问规则的顶级(而非内部)类不同。 final 修饰符在这里没有任何作用。