当前位置: 首页 > 知识库问答 >
问题:

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

羊舌成周
2023-03-14

我已经知道java中的内部类不能有静态成员,除非它们被宣布为最终的。但是,理论上不应该在局部类中声明静态成员吗?

例如。

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中存在静态(只是静态的,但不是最终的)成员,那么应该(或可以)以这种方式访问它们

outer class instance . inner class . member

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

希望我说清楚了。抱歉我的英语不好。

共有1个答案

曾翰飞
2023-03-14

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

内部类与其外部类的对象隐式关联,因此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相互独立)。

这不可能发生,因为静态变量本质上是全局变量。类内部类的所有实例必须共享相同的静态变量。

但为什么不这样呢??

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

希望我的回答能帮助你。

 类似资料:
  • 我正在装一个应用程序,它工作得很好。但当我使用 在OuterClass中,并通过

  • 静态内部类是指使用 static 修饰的内部类。示例代码如下: 上述示例中的 Inner 类就是静态内部类。静态内部类有如下特点。 1) 在创建静态内部类的实例时,不需要创建外部类的实例。 2) 静态内部类中可以定义静态成员和实例成员。外部类以外的其他类需要通过完整的类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例。 3) 静态内部类可以直接访问外部类的

  • 问题内容: 静态和非静态嵌套类有什么区别? 问题答案: 根据定义,内部类不能是静态的,因此我将重述您的问题为“静态和非静态嵌套类之间有什么区别?” 非静态嵌套类具有对其嵌套的类的成员的完全访问权。静态嵌套类没有对嵌套实例的引用,因此静态嵌套类无法调用非静态方法或访问嵌套该类的实例的非静态字段。

  • C++ 类 & 对象 我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进

  • 本文向大家介绍Java类的静态成员是什么?,包括了Java类的静态成员是什么?的使用技巧和注意事项,需要的朋友参考一下 在Java中,静态成员是属于该类的成员,您可以在不实例化该类的情况下访问这些成员。 static关键字可以与方法,字段,类(内部/嵌套),块一起使用。 静态方法-您可以使用关键字static创建静态方法。静态方法只能访问静态字段,方法。要访问静态方法,无需实例化该类,只需将类名用

  • 问题内容: Java教程说,由于内部类与封闭类的实例相关联,所以它(内部类)本身不能定义任何静态成员。 对我来说很有趣,为什么内部类不能声明静态成员,例如某个字段,该内部类的实例可能会与同一内部类的其他实例共享这些成员?这仅仅是Java中必须被视为理所当然的事情的实现吗? 问题答案: 基本上只是一个任意决定。我们没有理由也 不可能 得到支持,但还算不上什么好的理由 来 支持它。只需在外部类中声明静