gpt4 book ai didi

java - 内存中的内部类在哪里?

转载 作者:行者123 更新时间:2023-12-04 04:57:04 24 4
gpt4 key购买 nike

所以有人让我解释为什么第一种情况会抛出编译器错误而第二种情况不会:

class Outer { 

public Outer() {

Inner i = new Inner();

class Inner {

}

}

}

另一种情况是:

class Outer {

public Boss() {
Inner i = new Inner();
}

class Inner {
}

}

我成功地解释了第一种情况会引发编译器错误,因为您无法在 Inner 类被压入堆栈之前创建类 Inner 的对象。请随意详细说明或纠正我的理解。

我的主要问题是无法解释为什么我们可以创建一个 Inner 对象,即使在第二个场景中类 Inner 的代码出现在构造函数之后。我觉得这个问题的最佳答案是知道内部类在内存中的存储位置。我希望有人能提供可靠的解释。谢谢。

最佳答案

与栈无关,只是声明顺序。

在这段代码中:

class Outer { 
public Outer() { // constructor "method" body BEGIN
Inner i = new Inner();
class Inner {
}
} // constructor "method" body END
}

当你在一个普通 block 中声明 Inner(一个 LOCAL 类,不是内部类)(恰好在构造函数)。此代码在语义上等同于:

class Outer { 
public Outer() {
String fullName = firstName + " Smith";
String firstName = "John";
}
}

这显然行不通。

更新:

我看到可能会出现困惑的地方。希望这会澄清:

有四种类型的内部类,以及它们可以在哪里声明:

  • 静态成员类:声明为字段;
  • 成员类:也声明为字段;
  • 局部类:在 block 中声明,作为语句(就像变量声明一样);
  • 匿名类:也在 block 中声明,但是是表达式

底线是:再一次,作为一个本地类是一个声明,它就像一个变量声明,你不能在该声明之前访问它的“产品”执行。

关于java - 内存中的内部类在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16620336/

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