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