gpt4 book ai didi

java - 为什么Java禁止内部类中的静态字段?

转载 作者:IT老高 更新时间:2023-10-28 11:45:53 24 4
gpt4 key购买 nike

class OuterClass {
class InnerClass {
static int i = 100; // compile error
static void f() { } // compile error
}
}

虽然无法使用 OuterClass.InnerClass.i 访问静态字段,但如果我想记录应该是静态的内容,例如创建的 InnerClass 对象的数量,将其设为静态会很有帮助。那么为什么Java 禁止内部类中的静态字段/方法?

编辑:我知道如何让编译器对静态嵌套类(或静态内部类)感到满意,但我想知道为什么 java 禁止内部类(或普通内部类)中的静态字段/方法语言设计和实现方面,如果有人知道的话。

最佳答案

what I want to know is why java forbids static fields/methods inside inner classes

因为那些内部类是“实例”内部类。也就是说,它们就像封闭对象的实例属性。

由于它们是“实例”类,因此允许 static 功能没有任何意义,因为 static 意味着首先在没有实例的情况下工作地点。

这就像您尝试同时创建一个静态/实例属性。

举个例子:

class Employee {
public String name;
}

如果你创建了两个员工实例:

Employee a = new Employee(); 
a.name = "Oscar";

Employee b = new Employee();
b.name = "jcyang";

很清楚为什么每个属性name都有自己的值,对吧?

内部类也是如此;每个内部类实例都独立于另一个内部类实例。

因此,如果您尝试创建 counter 类属性,则无法在两个不同的实例之间共享该值。

class Employee {
public String name;
class InnerData {
static count; // ??? count of which ? a or b?
}
}

当您在上面的示例中创建实例 ab 时,静态变量 count 的正确值是多少?无法确定它,因为 InnerData 类的存在完全取决于每个封闭对象。

这就是为什么当类被声明为 static 时,它不再需要一个活的实例来活自己。现在没有依赖关系了,你可以自由声明一个静态属性。

我认为这听起来很重复,但如果您考虑实例属性与类属性之间的差异,那将是有道理的。

关于java - 为什么Java禁止内部类中的静态字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1953530/

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