【问题标题】:Inner / static nested classes in Java - outer class' nameJava中的内部/静态嵌套类-外部类的名称
【发布时间】:2017-08-27 14:49:37
【问题描述】:

我想问一下,在引用内部类或静态嵌套类时,什么时候需要显式写出外部类的名称。

例如:

class B {
    static class Inner {
        int a = 10;
    }
}

class Test extends B {
    public static void main(String[] args) {
        Test t = new Test();
        Inner obj = new Inner();
        System.out.println(obj.a);
    }
}

我想问的是什么情况下需要写:

B.Inner obj = new B.Inner();

而不是

Inner obj = new Inner();

【问题讨论】:

  • 您在标题中说 Inner classes,但您的示例显示了一个静态嵌套类。根据您提供的初始化语法,我猜您是在询问静态嵌套类,这是真的吗?
  • 是的,我对同时应用于内部类和静态嵌套类的问题感兴趣
  • 您将非内部类命名为 Inner 令人困惑。你认为这真的是个好主意吗?

标签: java inner-classes static-classes


【解决方案1】:

对于静态嵌套类(正如 G. Fiedler 在他的回答中提到的那样),当您在 B 的范围内时,您可以编写 new Inner()

您也可以在Test 中直接引用Inner,因为它扩展了B

在所有其他情况下,您需要说B.Innernew B.Inner()

内部类 - 根据定义,它们不是 static - 以不同方式初始化。我们来看这个例子B

class B {
    public class Inner {
        ...
    }
}

内部类总是与外部类的一个实例相关联。这意味着在这种情况下必须有一个B 的实例,我们才能实例化Inner。所以让我们这样做:

B b = new B();

顺便说一句,假设我们目前在B范围之外的某个地方@

为了创建Inner 的实例,我们使用B 的实例并编写:

B.Inner inner = b.new Inner();

如果我们在B 内部(在非静态方法中),我们可以简单地写

Inner inner = new Inner();

因为我们 - 或者更确切地说是编译器 - 知道 B 的实例必须存在才能与此 inner 绑定。

【讨论】:

    【解决方案2】:

    如果您在class B 的范围内,则可以使用new Inner()。在class B 之外必须使用new B.Inner()

    【讨论】:

    • 这不是真的,因为 OP 示例中的类 Inner 是一个静态嵌套类。所以new B()(注意括号!)不起作用。
    猜你喜欢
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多