首页 > 解决方案 > java内部类中静态成员的使用

问题描述

我开始知道 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 的副本。因此,如果允许 static(只是 static 但不是 final )成员出现在 innerClass 中,那么它们应该(或可以)以这种方式访问

outerClassInstance.innerClass.member

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

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

标签: javainner-classes

解决方案


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

内部类与其外部类的对象隐式关联,因此 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;

嗯,两个不同值的静态变量,并行存在,相互独立(因为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();

希望我的回答可以帮到你。


推荐阅读