2013-07-31 118 views
2

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

回答

1

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

一个类可以声明嵌套类。

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

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

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

1

A static嵌套类不需要封闭类的实例(如您所指出的那样),因此之间没有任何共享。

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

由于class在运行时是不可变的,所以这个相同的逻辑没有通过。

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

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

正如指出the tutorial一个static嵌套类和顶层类之间的唯一真正不同的是,一个static嵌套类可以访问它private static成员是包类。

+0

嗨,boris,感谢您的输入“由于一个类在运行时是不可变的,所以这个相同的逻辑不能通过。”任何想法为什么这种行为差异? – hakish

+0

行为有什么不同? 'class'是一个'class',一个变量是一个变量。他们完全不同。 –

0

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

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

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

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