gpt4 book ai didi

java - 为什么我不能通过内部类引用访问外部类数据成员?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:26 24 4
gpt4 key购买 nike

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);

}
}

我知道静态嵌套类可以访问外部类的数据成员,那为什么我不能通过内部类引用访问外部类变量,而是可以像上面那样在内部类中直接使用它来访问它呢?

最佳答案

Java 语言规范提供了以下访问静态字段的规则:

◆ If the field is static:

  • The Primary expression is evaluated, and the result is discarded. [...]
  • If the field is a non-blank final, then the result is the value of the specified class variable in the class or interface that is the type of the Primary expression.

请注意,规范不允许在其他类中搜索静态字段;仅考虑主要表达式的直接类型。

在您的例子中,主要表达式只是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 .

关于java - 为什么我不能通过内部类引用访问外部类数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43693560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com