java - Java 中的内部/静态嵌套类 - 外部类的名称

标签 java inner-classes static-classes

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

例如:

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();

最佳答案

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

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

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

内部类 - 根据定义不是 static - 被不同地初始化。让我们看一下这个例子 B:

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

内部类总是绑定(bind)到外部类的实例。这意味着在这种情况下,必须有一个 B 的实例,我们才能实例化 Inner。所以让我们这样做:

B b = new B();

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

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

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

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

Inner inner = new Inner();

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

关于java - Java 中的内部/静态嵌套类 - 外部类的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43172739/

相关文章:

java - 为什么我的自定义微调器被禁用/无响应?

java - 在 Java 中复制一个 Long 对象

Java BoneCP MySQL 连接超时

java - 从java中的内部类访问变量

Java - 从匿名内部类访问变量

c# - 当前上下文中不存在名称 'temp'(C# 桌面应用程序)

c# - 访问类的静态变量后,执行流程是怎样的?

java - 在运行时更改级别(通过 log4j.properties 和通过代码)

c++ - Makefiles - 继承类和内部类

logging - 从静态类记录 ASP.NET Core Web API