Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内存中的内部类在哪里?_Java_Inner Classes - Fatal编程技术网

Java 内存中的内部类在哪里?

Java 内存中的内部类在哪里?,java,inner-classes,Java,Inner Classes,所以有人让我解释为什么第一个场景会抛出编译器错误,而第二个场景不会: class Outer { public Outer() { Inner i = new Inner(); class Inner { } } } 另一种情况是: class Outer { public Boss() { Inner i = new Inner(); } class Inner { } } 我成功地解释了第一个场

所以有人让我解释为什么第一个场景会抛出编译器错误,而第二个场景不会:

class Outer { 

  public Outer() {

    Inner i = new Inner();        

    class Inner {

    } 

  }

}
另一种情况是:

class Outer {

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

  class Inner {
  }

}
我成功地解释了第一个场景引发了一个编译器错误,因为在类内部被推到堆栈上之前,无法创建类内部的对象。请随意详细说明或更正我的理解

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

与堆栈无关,只是声明顺序而已

在此代码中:

class Outer { 
  public Outer() { // constructor "method" body BEGIN
    Inner i = new Inner();        
    class Inner {
    } 
  } // constructor "method" body END
}
当您在普通块中声明
内部
(一个本地类,不是内部类)时(该块恰好位于构造函数内部)。此代码在语义上等同于:

class Outer { 
  public Outer() {
    String fullName = firstName + " Smith";
    String firstName = "John";
  }
}
这显然是行不通的

更新: 我知道哪里会出现混乱。希望这将澄清:

有四种类型的内部类,可以在其中声明它们:

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

底线是:再一次,由于本地类是一个语句,它就像一个变量声明,在执行该语句之前,您无法访问它的“产品”。

在第一种情况下,它不知道这里的内部内容,因此会给您带来编译错误,而第二种情况则不是这样,当我们调用
Boss
时,它只会创建该类的一个实例,因此在那时,
class-Inner
将被启动..我想你可以试试这个
类的外部{public-Outer(){class-Inner{}Inner i=new-Inner();}}
构造函数,在第二个代码中,它应该是
Outer()
,正确的?