来自Oracle的Java tutorials我发现了这个文本:
与类方法和变量一样,静态嵌套类与其外部类相关联。和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法 - 它只能通过对象引用来使用它们。
注意:静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。
使用封闭的类名访问静态嵌套类:
OuterClass.StaticNestedClass
例如,要为静态嵌套类创建对象,请使用以下语法:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
我认为不可能实例化一个静态类,所以我并不真正理解粗体句。
你知道这意味着什么吗?
答案 0 :(得分:37)
你要么将static
与abstract
混为一谈,要么kihero说,或者你正在用一个具有static
方法的类(这只是一个碰巧有静态的类)混淆了这个概念方法)。
静态嵌套类只是一个嵌套类,不需要其封闭类的实例。如果您熟悉C ++,那么 C ++中的所有类都是“静态”类。在Java中,默认情况下嵌套类不是静态的(这种非静态变种也称为“内部类”),这意味着它们需要一个外部类的实例,它们在隐藏字段的后台跟踪 - 但是这允许内部类引用其相关封闭类的字段。
public class Outer {
public class Inner { }
public static class StaticNested { }
public void method () {
// non-static methods can instantiate static and non-static nested classes
Inner i = new Inner(); // 'this' is the implied enclosing instance
StaticNested s = new StaticNested();
}
public static void staticMethod () {
Inner i = new Inner(); // <-- ERROR! there's no enclosing instance, so cant do this
StaticNested s = new StaticNested(); // ok: no enclosing instance needed
// but we can create an Inner if we have an Outer:
Outer o = new Outer();
Inner oi = o.new Inner(); // ok: 'o' is the enclosing instance
}
}
How to instantiate non static inner class within a static method
上有很多其他例子我实际上默认声明所有嵌套类都是静态的,除非我特别需要访问封闭类的字段。
答案 1 :(得分:13)
静态嵌套类本身并不是静态的。在java中,没有类是静态的。静态嵌套类中的静态关键字意味着它是外部类的另一个静态成员。但这只是另一个原始阶层。这就是为什么我们可以实例化这个类
答案 2 :(得分:5)
您将static
与abstract
混淆。抽象类无法实例化。 static
不是顶级类的有效限定符,但内部类的含义是您引用的类。
答案 3 :(得分:1)
我猜您对静态类有点误解了。 的确,每个抽象类和接口都不能实例化,但是您可以实例化一个静态类。 您应该注意的一件事是,每个静态类都是嵌套的静态类。 您不能仅创建静态类,如您所见: try to create a new class in eclipse
静态类始终属于包围它的“父类”,并且静态类和非静态类之间的区别是: 您可以像“父类”的静态属性一样引用子静态类:
ParentClass.NestedStaticClass nestedstatic = new ParentClass.NestedStaticClass();
,但是您只能通过实例化父类来引用非静态嵌套类,如下所示:
ParentClass parent = new ParentClass();
ParentClass.NestedClass nested = parent.new NestedClass();
差异与静态字段和非静态字段一样。