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

use*_*431 24 java static nested instantiation

从Oracle的Java 教程中我发现了这个文本:

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

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

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

OuterClass.StaticNestedClass

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

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

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

你知道这意味着什么吗?

Jas*_*n C 41

你不是混乱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
    }

}
Run Code Online (Sandbox Code Playgroud)

如何在静态方法中实例化非静态内部类的许多其他示例

我实际上默认声明所有嵌套类都是静态的,除非我特别需要访问封闭类的字段.

  • 只是为了清理术语.Java有嵌套类 - 静态和非静态.非静态嵌套类称为内部类.没有什么比静态内部类更好的了. (4认同)
  • 哇哦 我从来没有想过那种o.new Inner()模式。我永远不会将其视为有效的表达方式。伙计 (2认同)

小智 16

静态嵌套类本身并不是静态的.在java中,没有类是静态的.静态嵌套类中的静态关键字意味着它是外部类的另一个静态成员.但这只是另一个原始阶层.这就是为什么我们可以实例化这个类

  • 很棒的答案!到目前为止,这是实际回答问题的唯一答案. (5认同)
  • 抱歉,这个答案相当令人困惑 (4认同)

kih*_*eru 5

你是混淆staticabstract.抽象类无法实例化.static不是顶级类的有效限定符,但内部类的含义是您引用的类.

  • 他可能也会将静态方法与静态类混淆. (6认同)

Dai*_*Niu 5

我猜你对静态类有一点误解。确实,每个抽象类和接口都无法实例化,但您可以实例化静态类。您应该注意的一件事是每个静态类都是嵌套静态类。你不能只创建一个静态类,如你所见: 尝试在 eclipse 中创建一个新类

静态类总是属于包含它的“父类”,静态类和非静态类之间的区别是:您可以像引用“父类”的静态属性一样引用子静态类:

ParentClass.NestedStaticClass nestedstatic = new ParentClass.NestedStaticClass();
Run Code Online (Sandbox Code Playgroud)

但只能通过实例化父类来引用非静态嵌套类,如下所示:

ParentClass parent = new ParentClass();
ParentClass.NestedClass nested = parent.new NestedClass();
Run Code Online (Sandbox Code Playgroud)

区别就像静态字段和非静态字段之间的区别一样。