class OuterClass1 {
static private int a = 10;
void get() {
System.out.println("Outer Clas Method");
}
static class StaticInnerClass {
void get() {
System.out.println("Inner Class Method:" + a);
}
}
public static void main(String args[]) {
OuterClass1.StaticInnerClass b = new OuterClass1.StaticInnerClass();
b.get();
System.out.println(b.a);
System.out.println(b.c);
}
}
我知道静态嵌套类可以访问外部类数据成员,所以为什么我不能访问外部类变量throgh内部类引用但是可以通过直接在内部类中使用它来访问它?如上所述?
答案 0 :(得分:3)
Java语言规范提供了以下访问静态字段的规则:
◆如果该字段是静态的:
- 评估主表达式,并丢弃结果。 [...]
- 如果该字段是非空白的final,则结果是类或接口中指定的类变量的值,该类是Primary表达式的类型。
请注意,规范不允许在其他类中搜索静态字段;只考虑主表达式的直接类型。
在您的情况下,主要表达式只是b
。它被评估,其结果被丢弃,没有可观察到的效果。
主要表达式b
的类型为OuterClass1.StaticInnerClass
。因此,Java将b.a
视为OuterClass1.StaticInnerClass.a
。由于OuterClass1.StaticInnerClass
类不包含静态字段a
,因此编译器会产生错误。
当您访问类的方法内的字段时,会生成一组不同的规则。当编译器在
中看到a
时
System.out.println("Inner Class Method:" + a);
它搜索类本身,并在字段不存在时继续到外部类。这是编译器找到a
的地方,因此表达式可以正确编译。
注意:通过非静态表达式访问静态成员是个坏主意。 See this Q&A for an explanation
答案 1 :(得分:0)
你没有向我们展示内部类,StaticInnerClass
不是内部类。 Java中没有“静态内部类”这样的东西,因为根据定义,内部类是一个非静态的嵌套类。只有内部类可以直接访问包含类型的成员。因为StaticInnerClass
不是内部类,所以它没有这种访问权。