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

问题描述 投票:0回答:1

我已经知道Java中的内部类不能具有静态成员,除非并且直到将它们声明为final为止。但是从理论上讲,在本地类中声明静态成员不应该吗?

例如

public class OuterClass
{
  class innerClass
  {
    public static int i = 1;
  // inner class code goes here
  }
}

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

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

但是为什么不这样呢?

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

创建OuterClass的实例时,它还包含innerClass的副本。因此,如果允许innerClass中存在静态成员(只是静态成员而不是final成员),则应该(或可以通过这种方式)访问它们

outerClassInstance.innerClass.member

我在想错方向吗?为什么以内部类的方式设计内部类有什么特别的原因?

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

java inner-classes
1个回答
1
投票

但是从理论上讲,在本地类中声明静态成员不应该吗?

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

假设,您没有将'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 outer = new OuterClass(); //I modified the variable name to avoid confusion
outer.InnerClass innerclassInstance = new outer.InnerClass();

按照惯例,

Type name = new Type();

,因此外部(名称)无法解析为类型。

您可以这样做:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.