java - 从另一个实例创建一个实例?

标签 java inner-classes

我很困惑,怎么会这样写......它从另一个实例创建一个实例

st.new FirstLevel();

    public class ShadowTest {

    public int x = 0;



    class FirstLevel {

        public int x = 1;

        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);
            System.out.println("this.x = " + this.x);
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
        }
    }

    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);

        ShadowTest.FirstLevel mali = st.new FirstLevel();           
    }
}

最佳答案

这里,FirstLevel 是所谓的内部类 - 这是因为它是在另一个类内部定义的。两种关系(“外部”和“内部”)都是简单的类(而不是接口(interface)、枚举或记录)。在这种情况下,除非内部类具有修饰符static(并且在您的代码中没有),否则您将获得一个实例内部类

此类类具有与其关联的外部类型的隐藏字段。就好像您的 FirstLevel 类具有此字段:

private final ShadowTest outerInstance;

ShadowTest 的每个构造函数都有一个该字段的参数,但是,它是隐藏的并且有点特殊。

由于此 secret 字段存在,您可以执行诸如从 FirstLevel 内调用 ShadowTest 的非静态方法之类的操作。

如果您输入 new FirstLevel(),它就会起作用......但仅限于 ShadowTest 内的非静态上下文中。在其他任何地方,编译器都会告诉您它不知道要为该 secret 字段传递哪个 ShadowTest 实例。您可以显式定义 ShadowTest 的实例。但不是使用 new FirstLevel(shadowTestInstance),而是使用看起来有点奇怪的语法 shadowTestInstance.new FirstLevel()。但是,这是同一件事:传递给构造函数的参数。

我通常建议您不要使用实例内部类,除非您确实知道它们最适合该情况;这个隐藏的字段往往会引起困惑和意外。我什至想说你永远不应该拥有实例内部类;如果必须保留对外部类实例的引用,请使其显式(添加实际字段,并在构造函数中创建实际参数)。这样你至少可以避免意外和困惑。换句话说,将您的 FirstLevel 类标记为 static。通过明确你的外部引用,阴影的事情也会消失;现在您只需使用 xthis.x 引用 FirstLevel 中的 x 字段,以及 outerInstance .x 表示外部字段:

static class FirstLevel {
    final ShadowTest shadow;
    int x;

    public FirstLevel(ShadowTest shadow) { this.shadow = shadow; }
}

关于java - 从另一个实例创建一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60263525/

相关文章:

java - 如何从 Java 中的 URL 读取 JSON 数据?

java - Spring Boot 仪表板不会在 VSCode 上显示应用程序

java - 有没有一种方法可以在有或没有反射的情况下访问内部类中的私有(private)方法

java - Hibernate @Any 无法获取对象

java - 尝试与 OrientDB 合作

java - 为什么我的 Spring Boot 应用程序在 Heroku 中部署后就无法启动

c++ - 类 - 从对象 vector 中删除特定对象

java - 将内部类扩展为嵌套类?

java - 在静态嵌套类中实例化/引用静态嵌套类