静态嵌套类和顶级类的初始化之间有区别?我明白,静态类不需要一个封闭的类实例,但如果有多个静态嵌套类的实例会发生什么?就像静态变量被类实例共享一样,静态类的实例也会被共享吗?静态类在Java初始化
回答
让我看看我是否正确理解你的问题。
一个类可以声明嵌套类。
如果一个C1类声明了一个non-static
内部类C2,则C2可以访问所有C1的字段和方法,而不管它们的访问修饰符如何。实际上,C2被视为一个字段:无论何时创建C1的新实例,都会加载其声明。这意味着non-static
内部类比static
更昂贵,如果不是绝对必要的,应该避免。
如果一个C1类声明了一个static
内部类C3,那么C3在C1的所有实例中共享。它可以访问C1的所有静态方法和字段,但不能访问非静态方法 - C3根据定义不与C1的特定实例绑定,因此它没有任何访问权限。
当你声明一个静态内部类时,你并没有说它的实例。你只是告诉编译器该类的定义是在封闭类的所有实例中共享的。所以,不,嵌套静态类的实例不会自动共享。
A static
嵌套类不需要封闭类的实例(如您所指出的那样),因此到之间没有任何共享。
如果您有一个static
变量,那么该类的每个实例都将持有对同一个static
变量的引用。一个类的变化将改变所有类中的变量。
由于class
在运行时是不可变的,所以这个相同的逻辑没有通过。
static
嵌套类的实例与任何其他类的实例实际上是相同的。
如果您有一个指向static
嵌套类实例的static
变量,则共享实例的唯一方法。在这种情况下,它与任何其他static
变量相同。
正如指出the tutorial一个static
嵌套类和顶层类之间的唯一真正不同的是,一个static
嵌套类可以访问它private static
成员是包类。
每个类都是Class类型的单例对象。
A 静态内部类是基本情况。另一个是正常的内部类,它的实例对象也有一个OuterClass.this
指针。
因此,任何班级的班级初始化都没有区别。
您声明为“静态类”的嵌套类与另一个顶级类没有区别,如inner class。将静态声明添加到声明中,可以将它声明为与仅作为其名称空间的所有者类分离。
package org.stack.question
public class Top {
public static class Nested {
}
}
要创建嵌套类的一个实例,你只能这样做
Object instance = new org.stack.question.Top.Nested();
从规格:
嵌套类不属于内部类可以声明静态成员 自如,在按照Java编程 语言的通常规则。成员接口(第8.5节)是隐式静态的,因此它们从不被认为是内部类。
- 1. Java - 静态类及其父初始化
- 2. 如何在初始化静态类之前初始化静态属性?
- 3. 静态初始化的Java序列化
- 4. 静态初始化
- 5. 在类中初始化静态卷曲
- 6. java球衣静态字段初始化
- 7. Java静态初始化命令
- 8. 静态成员java初始化顺序
- 9. java继承的静态初始化
- 10. Java静态字段初始化
- 11. 初始化静态指针在静态类
- 12. 如何在JavaScript静态类中初始化静态变量?
- 13. XamlParseException初始化一个静态类
- 14. 需要静态类初始化
- 15. 哪个静态类首先初始化?
- 16. 初始化静态内部类
- 17. 静态类初始化何时发生?
- 18. 静态类初始化阶段
- 19. C++类的静态成员初始化
- 20. 静态初始化派生类
- 21. 内部类的静态初始化器?
- 22. C++类静态成员初始化
- 23. 隐式初始化静态类
- 24. .NET中的静态类初始化
- 25. 初始化静态类成员
- 26. 懒属性初始化静态类C#
- 27. C# - 将静态类初始化为非静态类?
- 28. 有没有办法在Java中重新初始化静态类?
- 29. 静态初始化数组?
- 30. 静态HashMap的初始化
嗨,boris,感谢您的输入“由于一个类在运行时是不可变的,所以这个相同的逻辑不能通过。”任何想法为什么这种行为差异? – hakish
行为有什么不同? 'class'是一个'class',一个变量是一个变量。他们完全不同。 –