为类生成多个.class文件?

时间:2009-06-23 11:22:26

标签: java class javac

出于好奇,为什么有时会在编译后为类生成多个Java .class文件?例如,我的应用程序有六个类。对于一个类,总共生成了10个.class文件,从MyClass#1开始到MyClass#10。

7 个答案:

答案 0 :(得分:27)

适用于inner classesstatic nested classes。有数字的是匿名的内部类。

例如:


class Foo {
   class Bar { }
   static class Baz { }
   void run() {
      Helper t = new Helper() {
         int helpMethod() {
            return 2;
         }
      };
    }
}

这将生成类文件Foo.classFoo$Bar.classFoo$Baz.classFoo$1.class(用于Helper接口的实现)

答案 1 :(得分:5)

如果

,您可以从单个源文件中获得更多.class文件
  • 该类包含内部类或静态内部类。内部类可以嵌套。他们的名字是<outer class name>$<inner class name>

  • 内部接口始终是静态的。

  • 匿名内部类(实际上是没有名称的普通内部类)

  • 主类之前和之后的包访问接口和类。您可以在单个Java源文件中拥有任意数量的包访问类和接口。通常只有类使用的小辅助对象才会被放入同一个文件中。

答案 2 :(得分:4)

如果您的类包含内部类,则一个java源文件可以生成多个类文件。匿名内部类由编号的类文件表示。

答案 3 :(得分:2)

java中的每个类都属于.java文件,但.java文件可以包含多个类。这包括内部和匿名类。为内部类生成的.class文件在其名称中包含“$”。匿名内部类获得数字。

答案 4 :(得分:0)

要添加上面的答案,这是基于Comparators生成的内部类的另一个很好的例子(每个Comparator都是用不同的 MyClass $ X.class ):

public class MyClass {
    ...

    public void doSomething() {
        ...
        Collections.sort(list, new Comparator<MyObj>() {
            public int compare(MyObj o1, MyObj o2) {
                ...
            }
        });
        ...
    }

    ...
}

答案 5 :(得分:0)

如果有一个X.java文件并且它包含4个collections.sort(){}那么在编译X.class之后,X $ 1.class,X $ 2.class,X $ 3.class,X $ 4.class将生成。

对于内部类和静态内部类,会生成更多.class文件。

答案 6 :(得分:-2)

编译时将生成多个类,仅当您的类具有内部类时才会生成。

参阅: Why does Java code with an inner class generates a third SomeClass$1.class file?