静态嵌套类和顶级类的初始化有区别吗?我知道静态类不需要封闭类实例,但是如果静态嵌套类有多个实例会发生什么?就像静态变量被类实例共享一样,静态类的实例也会被共享吗?
4 回答
嵌套类static
不需要封闭类的实例(正如您所指出的),因此没有什么可共享的。
如果您有一个static
变量,那么该类的每个实例都将包含对同一static
变量的引用。一个类的变化将改变所有类的变量。
由于 aclass
在运行时是不可变的,因此无法执行相同的逻辑。
嵌套类的实例static
实际上与任何其他类的实例相同。
共享实例的唯一方法是如果您有一个static
指向static
嵌套类实例的变量。在这种情况下,它与任何其他static
变量相同。
正如本教程所指出的,static
嵌套类和顶级类之间唯一真正的区别是static
嵌套类可以访问private static
其封闭类的成员。
让我看看我是否正确理解了你的问题。
一个类可以声明嵌套类。
如果类 C1 声明了non-static
内部类 C2,则 C2 可以访问 C1 的所有字段和方法,而不管它们的访问修饰符如何。实际上,C2 被视为一个字段:每当创建 C1 的新实例时,都会加载其声明。这意味着non-static
内部类比内部类更昂贵static
,如果不是绝对必要,应该避免使用。
如果一个类 C1 声明了一个static
内部类 C3,那么 C3 将在 C1 的所有实例之间共享。它可以访问 C1 的所有静态方法和字段,但不能访问非静态方法和字段 - 根据定义,C3 与 C1 的特定实例无关,因此它无法访问。
当你声明一个静态内部类时,你并没有说明它的实例。您只是告诉编译器该类的定义在封闭类的所有实例之间共享。所以,不,嵌套静态类的实例不会自动共享。
每个类都是 Class 类型的单例对象。
静态内部类是基本情况。它是另一个普通的内部类,它也有一个OuterClass.this
指向其实例对象的指针。
因此,任何类的类初始化都没有区别。
您将其声明为“静态类”的嵌套类与内部类这样的另一个顶级类没有区别。将静态添加到它的声明中,您可以将它与所有者类分开,而所有者类只是它的命名空间。
package org.stack.question
public class Top {
public static class Nested {
}
}
要创建嵌套类的实例,您只能这样做
Object instance = new org.stack.question.Top.Nested();
从规格:
不是内部类的嵌套类可以按照 Java 编程语言的通常规则自由声明静态成员。成员接口(第 8.5 节)是隐式静态的,因此它们永远不会被视为内部类。