2

静态嵌套类和顶级类的初始化有区别吗?我知道静态类不需要封闭类实例,但是如果静态嵌套类有多个实例会发生什么?就像静态变量被类实例共享一样,静态类的实例也会被共享吗?

4

4 回答 4

1

嵌套类static不需要封闭类的实例(正如您所指出的),因此没有什么共享的。

如果您有一个static变量,那么该类的每个实例都将包含对同一static变量的引用。一个类的变化将改变所有类的变量。

由于 aclass在运行时是不可变的,因此无法执行相同的逻辑。

嵌套类的实例static实际上与任何其他类的实例相同。

共享实例的唯一方法是如果您有一个static指向static嵌套类实例的变量。在这种情况下,它与任何其他static变量相同。

正如本教程所指出的,static嵌套类和顶级类之间唯一真正的区别是static嵌套类可以访问private static其封闭类的成员。

于 2013-07-31T09:45:53.860 回答
1

让我看看我是否正确理解了你的问题。

一个类可以声明嵌套类。

如果类 C1 声明了non-static内部类 C2,则 C2 可以访问 C1 的所有字段和方法,而不管它们的访问修饰符如何。实际上,C2 被视为一个字段:每当创建 C1 的新实例时,都会加载其声明。这意味着non-static内部类比内部类更昂贵static,如果不是绝对必要,应该避免使用。

如果一个类 C1 声明了一个static内部类 C3,那么 C3 将在 C1 的所有实例之间共享。它可以访问 C1 的所有静态方法和字段,但不能访问非静态方法和字段 - 根据定义,C3 与 C1 的特定实例无关,因此它无法访问。

当你声明一个静态内部类时,你并没有说明它的实例。您只是告诉编译器该类的定义在封闭类的所有实例之间共享。所以,不,嵌套静态类的实例不会自动共享。

于 2013-07-31T10:01:59.033 回答
0

每个类都是 Class 类型的单例对象。

静态内部类是基本情况。它是另一个普通的内部类,它也有一个OuterClass.this指向其实例对象的指针。

因此,任何类的类初始化都没有区别。

于 2013-07-31T09:48:31.677 回答
0

您将其声明为“静态类”的嵌套类与内部类这样的另一个顶级类没有区别。将静态添加到它的声明中,您可以将它与所有者类分开,而所有者类只是它的命名空间。

package org.stack.question

public class Top {

  public static class Nested {

  }

}

要创建嵌套类的实例,您只能这样做

Object instance = new org.stack.question.Top.Nested();

从规格:

不是内部类的嵌套类可以按照 Java 编程语言的通常规则自由声明静态成员。成员接口(第 8.5 节)是隐式静态的,因此它们永远不会被视为内部类。

于 2013-07-31T09:50:42.303 回答