【问题标题】:Why does javac create an additional class? [duplicate]javac 为什么要创建一个额外的类? [复制]
【发布时间】:2018-05-15 08:06:02
【问题描述】:

我已经编译了以下代码(为简洁起见,省略了方法和变量):

// Outer.java
public class Outer
{
    private class Inner
    {
    }
    void someMethod()
    {
        Inner inObj = this.new Inner();
    }
    public static void main(String s[])
    {
        Outer outerObj = new Outer();
    }
}

当我列出创建的类时,它显示如下:

Outer$1.class
Outer$Inner.class
Outer.class

OuterOuter$Inner 看起来合乎逻辑。 Outer$1 类的目的是什么?这些在时间尺度上的创建顺序是什么?

【问题讨论】:

  • “这些在时间尺度上的创建顺序是什么?”为什么您认为了解这一点很重要?
  • 为什么不呢?就是了解javac的创建类的机制。
  • Order 似乎是 1. Outer.class 2. Outer$Inner.class 3. Outer$1.class,在 Windows 中按 date modified 列排序时。
  • 类文件的创建顺序何时重要?在执行时是否以及何时创建类的实例是相关的,但何时创建类文件似乎有些无关紧要。
  • Oak's answer 给骗子解释了一下,有点。

标签: java inner-classes outer-classes


【解决方案1】:

好奇。我不确定这是为了什么。但是如果你反编译类,你可以看到它是如何使用的

public class Outer {
  public Outer();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  void someMethod();
    Code:
       0: new           #2                  // class Outer$Inner
       3: dup
       4: aload_0
       5: aconst_null
       6: invokespecial #3                  // Method Outer$Inner."<init>":(LOuter;LOuter$1;)V
       9: astore_1
      10: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #4                  // class Outer
       3: dup
       4: invokespecial #5                  // Method "<init>":()V
       7: astore_1
       8: return
}

class Outer$Inner {
  final Outer this$0;

  Outer$Inner(Outer, Outer$1);
    Code:
       0: aload_0
       1: aload_1
       2: invokespecial #1                  // Method "<init>":(LOuter;)V
       5: return
}

class Outer$1 {
}

所以,Outer$1 似乎什么都没有——甚至没有默认构造函数。但是对Outer$1 的引用必须传递给Outer$Inner 才能构造它。神秘的是,someMethod 中传递的值是nullsomeMethod 中的第 5 行)。

【讨论】:

    猜你喜欢
    • 2014-01-08
    • 2019-03-23
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2020-08-01
    • 2012-09-16
    相关资源
    最近更新 更多