【问题标题】:Can a static nested class be instantiated in Java?可以在 Java 中实例化静态嵌套类吗?
【发布时间】:2013-08-20 01:44:39
【问题描述】:

来自 Oracle 的 Java tutorials 我找到了这段文字:

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

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

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

OuterClass.StaticNestedClass

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

OuterClass.StaticNestedClass nestedObject = 新的 OuterClass.StaticNestedClass();

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

你知道这意味着什么吗?

【问题讨论】:

  • 是的,有可能。您可能正在考虑一个非静态内部类,在这种情况下,您只能通过已经创建的外部类实例来实例化它。此外,如果您熟悉 C#,则无法用该语言实例化静态类。这条语句清楚地说明了这一点:“实际上,静态嵌套类在行为上是一个顶级类,为了包装方便,它已经嵌套在另一个顶级类中。”
  • 我的问题是没有在 tomcat 中重新加载应用程序!它需要使用更新的内部类作为静态重新加载类文件。仅仅替换服务器文件是不够的 - 必须重新加载应用程序:)

标签: java static nested instantiation


【解决方案1】:

您要么像 kihero 所说的那样将 staticabstract 混淆,要么将这个概念与具有 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 上的许多其他示例

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

【讨论】:

  • 谢谢,这回答了我的问题!
  • 只是为了澄清术语。 Java 有嵌套类——静态的和非静态的。非静态嵌套类称为内部类。没有什么能比得上静态内部类。
  • @Swapnil 谢谢你的关注。 “静态嵌套类”,正式为 static 品种。
  • @JasonC 有没有办法从反射中实例化一个私有的嵌套内部类,我需要在我的一个单元测试中实现它。
  • 哇哦。我从未想到过o.new Inner() 模式。我永远不会认为这是一个有效的表达方式。太远了,伙计。
【解决方案2】:

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

【讨论】:

  • 对不起,这个答案相当混乱
  • 很好的答案!这是迄今为止唯一真正回答问题的答案。
【解决方案3】:

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

【讨论】:

  • 他也可能把静态方法和静态类混淆了。
【解决方案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();

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

【讨论】:

  • 嵌套静态类就像父类的静态属性。所有静态属性都可以直接使用类名访问。像 Someclass.someStaticProperty 或 SomeClass.someStaticMethod。这里我们没有使用 new 关键字来访问父类的静态属性或静态方法。那为什么这里需要 new 关键字。 "ParentClass.NestedStaticClass nestedstatic = new ParentClass.NestedStaticClass()"
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多