内存中的内部类在哪里?

时间:2013-05-18 03:17:00

标签: java inner-classes

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

class Outer { 

  public Outer() {

    Inner i = new Inner();        

    class Inner {

    } 

  }

}

另一种情况是:

class Outer {

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

  class Inner {
  }

}

我成功地解释了第一个场景抛出编译器错误,因为在类Inner被推入堆栈之前无法创建Inner类的对象。请随意详细说明或纠正我的理解。

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

1 个答案:

答案 0 :(得分:3)

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

在此代码中:

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

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

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

这显然不起作用。

更新

我看到可能出现混乱的地方。希望这将澄清:

有四种类型的内部类,可以声明它们的位置:

  • 静态成员类:声明为字段;
  • 会员类:也宣布为fiels;
  • 本地类:在块中声明,作为语句(就像变量声明一样);
  • 匿名类:也在块中声明,但表达式

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