Java中的静态类初始化

时间:2013-07-31 09:42:54

标签: java

静态嵌套类和顶级类的初始化之间是否存在差异?我理解静态类不需要封闭的类实例,但如果有静态嵌套类的多个实例会发生什么?就像类实例共享静态变量一样,是否也会共享静态类的实例?

4 个答案:

答案 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节)是隐式静态的,因此它们是   从未被认为是内部阶级。