java内部类中静态成员的使用

java内部类中静态成员的使用,java,inner-classes,Java,Inner Classes,我知道java中的内部类不能有静态成员,除非它们被声明为final。但从理论上讲,在本地类中声明静态成员难道不可能吗 例如 我知道内部类的标准初始化是这样发生的: OuterClass outerClass = new OuterClass(); OuterClass.innerClass innerclassInstance = outerClass.new innerClass(); 但为什么不是这样呢 OuterClass outerClass = new OuterClass(); o

我知道java中的内部类不能有静态成员,除非它们被声明为final。但从理论上讲,在本地类中声明静态成员难道不可能吗

例如

我知道内部类的标准初始化是这样发生的:

OuterClass outerClass = new OuterClass();
OuterClass.innerClass innerclassInstance = outerClass.new innerClass();
但为什么不是这样呢

OuterClass outerClass = new OuterClass();
outerClass.innerClass innerclassInstance = new outerClass.innerClass();

创建OuterClass的实例时,它还包含innerClass的副本。所以,若staticjust static而不是final成员被允许出现在innerClass中,那个么它们应该或者可以通过这种方式访问

OuterCasInstance.innerClass.member

我是不是想错了方向?内部类的设计方式有什么特别的原因吗

希望我清楚。对不起,我的英语很差

但从理论上讲,在本地类中声明静态成员难道不可能吗

内部类与其外部类的对象隐式关联,因此内部类的存在完全取决于外部类的每个封闭对象

让我们想象一下,您没有将'i'声明为final,您创建了OuterClass类的实例a和实例b,这两个实例彼此独立。我们可以设置:

OuterClass a = new OuterClass();
OuterClass.InnerClass a1 = a.new InnerClass();
a1.i = 9;

OuterClass b = new OuterClass();
OuterClass.InnerClass b1 = b.new InnerClass();
b1.i = 18;
Hmm,一个具有两个不同值的静态变量,并行存在,彼此独立,因为a和b彼此独立

它不可能发生,因为静态变量本质上是全局变量。InnerClass类的所有实例必须共享同一个静态变量

但为什么不是这样呢

OuterClass outerClass = new OuterClass();
outerClass.innerClass innerclassInstance = new outerClass.innerClass();

按照惯例

Type name = new Type();
,因此无法将名称解析为类型

您可以这样做:

OuterClass.InnerClass innerclassInstance = new OuterClass().new InnerClass();

希望我的回答能对您有所帮助。

因为静态成员从不依赖于实例。我知道类中的静态变量应该也永远不会依赖于该类的实例。但是我不明白为什么内部类中的静态变量不应该依赖于封闭类或外部类的实例@csabinho你能详细说明一下吗。。提前谢谢好吧,为什么要呢?你能给我一个内部类的静态变量依赖于外部类的实例的例子吗?如果它依赖于外部类的实例,那么内部类的所有实例都有可能拥有一个公共变量,它们可以修改该变量,并将该变量用于某些目的,比如同步,而不接触外部类中的字段,这会导致代码更加紧凑。不是吗?我真的不明白。你能在你的问题中编辑一个代码示例吗?谢谢你的回答。为什么不允许a1.i和b1.i有不同的值,因为它们来自不同的环境a和b并且是独立的。这里,因为静态变量本质上是全局变量。InnerClass类的所有实例必须共享同一个静态变量。我们最初的假设得出的结论与“静态”的定义相矛盾。我刚刚发现这篇文章:。为了更好的理解,你可以参考。我已经浏览了链接。我的问题是重复的,我应该在提问之前搜索足够多的问题。不管怎样,非常感谢你“做范团”。我相信你已经给出了最好的答案。我很高兴能帮助你。
OuterClass.InnerClass innerclassInstance = new OuterClass().new InnerClass();