这个问题在这里已有答案:
静态和非静态嵌套类有什么区别?
内部类by definition不能是静态的,所以我要重新提出你的问题:“静态和非静态嵌套类之间有什么区别?”
非静态嵌套类具有对其嵌套的类的成员的完全访问权。静态嵌套类没有对嵌套实例的引用,因此静态嵌套类不能调用非静态方法或访问嵌套它的类实例的非静态字段。
让我们看看这些问题的智慧来源:Joshua Bloch的Effective Java:
从技术上讲,没有静态的内部类。根据Effective Java,正确的术语是静态嵌套类。非静态嵌套类确实是一个内部类,以及匿名类和本地类。
现在引用:
非静态嵌套类的每个实例都隐式地与其包含类的封闭实例相关联......可以在封闭实例上调用方法。
静态嵌套类无权访问封闭实例。它也占用更少的空间。
静态内部类和非静态内部类之间存在两个差异。
看这个例子
class A
{
class B
{
// static int x; not allowed here
}
static class C
{
static int x; // allowed here
}
}
class Test
{
public static void main(String… str)
{
A a = new A();
// Non-Static Inner Class
// Requires enclosing instance
A.B obj1 = a.new B();
// Static Inner Class
// No need for reference of object to the outer class
A.C obj2 = new A.C();
}
}
讨论嵌套类......
不同之处在于,静态的嵌套类声明可以在封闭类之外实例化。
如果您有一个非静态的嵌套类声明,Java将不允许您实例化它,除非通过封闭类。从内部类创建的对象链接到从外部类创建的对象,因此内部类可以引用外部的字段。
但是如果它是静态的,那么链接就不存在了,外部字段不能被访问(除了通过像任何其他对象那样的普通引用),因此你可以自己实例化嵌套类。
static inner class:可以声明静态和非静态成员,但只能访问其父类的静态成员。
非静态内部类:只能声明非静态成员,但可以访问其父类的静态和非静态成员。
内部类不能是静态的,所以我要重新提出你的问题为“静态和非静态嵌套类之间有什么区别?”。
正如你所说的内部类不能是静态的......我发现下面的代码是静态的......原因?或哪个是正确的....
是的,静态嵌套类型的语义中没有任何内容可以阻止您这样做。这个片段运行正常。
public class MultipleInner {
static class Inner {
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Inner();
}
}
}
这是本网站发布的代码......
对于问题--->静态嵌套类可以多次实例化吗?
答案是--->
现在,嵌套类型当然可以进行自己的实例控制(例如私有构造函数,单例模式等),但这与嵌套类型无关。此外,如果嵌套类型是静态枚举,当然您根本无法实例化它。
但总的来说,是的,静态嵌套类型可以多次实例化。
请注意,从技术上讲,静态嵌套类型不是“内部”类型。
静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。