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

2022-09-01 05:41:05

从Oracle的Java教程中,我找到了这段文字:

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

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

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

OuterClass.StaticNestedClass

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

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

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

你知道这意味着什么吗?


答案 1

你要么像kihero所说的那样混淆了,要么你用一个具有方法的类(它只是一个碰巧具有静态方法的类)混淆了这个概念。staticabstractstatic

静态嵌套类只是一个嵌套类,不需要其封闭类的实例。如果您熟悉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
    }

}

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

默认情况下,我实际上将所有嵌套类声明为静态,除非我特别需要访问封闭类的字段。


答案 2

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