【问题标题】:Where are inner classes in memory?内存中的内部类在哪里?
【发布时间】:2013-05-18 03:16:59
【问题描述】:

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

class Outer { 

  public Outer() {

    Inner i = new Inner();        

    class Inner {

    } 

  }

}

另一种情况是:

class Outer {

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

  class Inner {
  }

}

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

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

【问题讨论】:

  • 在第一种情况下,它不知道这里是什么,所以它会给你编译错误,而第二种情况不是这样,当我们调用Boss时才会创建该类的一个实例,所以那时,class Inner 将被启动..
  • 我想你试试这个class Outer { public Outer() { class Inner { } Inner i = new Inner(); } }
  • 构造函数,在第二段代码中,应该是Outer()吧?

标签: java inner-classes


【解决方案1】:

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

在这段代码中:

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

正如您在普通块(恰好位于构造函数内部)中声明 InnerLOCAL 类,不是内部类)。这段代码在语义上等价于:

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

这显然行不通。

更新:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2022-01-18
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多