可以在Java中实例化静态嵌套类吗?

时间:2013-08-17 22:25:43

标签: java static nested instantiation

来自Oracle的Java tutorials我发现了这个文本:

  

与类方法和变量一样,静态嵌套类与其外部类相关联。和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法 - 它只能通过对象引用来使用它们。

     

注意:静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。

     

使用封闭的类名访问静态嵌套类:

     

OuterClass.StaticNestedClass

     

例如,要为静态嵌套类创建对象,请使用以下语法:

     

OuterClass.StaticNestedClass nestedObject =        new OuterClass.StaticNestedClass();

我认为不可能实例化一个静态类,所以我并不真正理解粗体句。

你知道这意味着什么吗?

4 个答案:

答案 0 :(得分:37)

你要么将staticabstract混为一谈,要么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)

您将staticabstract混淆。抽象类无法实例化。 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();

差异与静态字段和非静态字段一样。