36

从 Oracle 的 Java教程中,我发现了这段文字:

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

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

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

OuterClass.StaticNestedClass

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

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

我认为不可能实例化一个静态类,所以我不太理解粗体的句子。

你知道这意味着什么吗?

4

5 回答 5

52

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

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

}

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

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

于 2013-08-17T22:39:58.100 回答
24

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

于 2015-05-10T14:58:06.380 回答
5

staticabstract. 抽象类不能被实例化。static不是顶级类的有效限定符,但内部类的含义是您引用的那个。

于 2013-08-17T22:29:27.350 回答
4

我猜你有点误解了静态类。确实不能实例化每个抽象类和接口,但可以实例化静态类。您应该注意的一件事是每个静态类都是嵌套的静态类。如您所见,您不能只创建一个静态类: try to create a new class in eclipse

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

ParentClass.NestedStaticClass nestedstatic = new ParentClass.NestedStaticClass();

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

ParentClass parent = new ParentClass();
ParentClass.NestedClass nested = parent.new NestedClass();

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

于 2018-11-02T07:34:01.213 回答
0

太长了,没看懂:每个具体类都可以实例化。

在调用和实例化方面,我们不应期望具体静态嵌套类与静态变量和静态方法具有相同的功能。

我的意思是什么?当我们创建变量和方法时,它们可以是静态的或非静态的。上一句中的关键词是“要么”。

静态意味着它们属于类,我们必须直接调用它们,如下所示:

Class.staticVariable();
Class.staticMethod();

非静态意味着它们属于该类的一个实例,我们必须这样称呼它们:

Class obj = new Class();
System.out.println(nonStaticVariable);
obj.nonStaticMethod();

但是这里我们谈论的是一个类,而不是一个变量或一个方法。 每个具体类都可以被实例化。因此,我们不应该期望具体的静态嵌套类是不可实例化的。

于 2022-02-14T10:37:15.357 回答