17

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

4

7 回答 7

31

这些用于内部类静态嵌套类。带有数字的是匿名内部类。

例如:


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

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

于 2009-06-23T11:23:22.910 回答
5

如果您从单个源文件中获得更多 .class 文件

  • 该类包含内部类或静态内部类。内部类可以嵌套。他们的名字是<outer class name>$<inner class name>

  • 内部接口总是静态的。

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

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

于 2009-06-23T11:53:40.757 回答
4

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

于 2009-06-23T11:23:31.130 回答
2

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

于 2009-06-23T11:24:12.330 回答
0

为了补充上面的答案,这是基于 Comparator 生成的内部类的另一个很好的示例(每个 Comparator 都在不同的MyClass$X.class中编译):

public class MyClass {
    ...

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

    ...
}
于 2017-11-21T10:14:22.503 回答
0

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

在内部类和静态内部类的情况下,会生成更多 .class 文件。

于 2018-01-05T11:44:37.143 回答
-2

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

参考: 为什么带有内部类的 Java 代码会生成第三个 SomeClass$1.class 文件?

于 2009-06-23T11:51:17.173 回答