gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:59:32 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com