Multiple .class files generated for a class?

2019-01-09 12:09发布

问题:

Out of curiosity, why are sometimes multiple Java .class files generated for a class after compilation? For example, my application has six classes. For one class, a total of 10 .class files has been generated, starting from MyClass#1 up to MyClass#10.

回答1:

These are for inner classes and static nested classes. The ones with numbers are anonymous inner classes.

For example:


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

This will produce class files Foo.class, Foo$Bar.class, Foo$Baz.class and Foo$1.class (for the implementation of the Helper interface)



回答2:

You get more .class fils from a single source file if

  • the class contains inner classes or static inner classes. Inner classes can nest. Their names are <outer class name>$<inner class name>.

  • inner interfaces which are always static.

  • anonymous inner classes (which in fact are plain inner classes without a name)

  • package access interfaces and classes before and after your main class. You can have an arbitrary number of package access classes and interfaces in a single Java source file. Usually small helper objects that are only used by the class are just put into the same file.



回答3:

One java source file can generate multiple class files, if your class contains inner classes. Anonymous inner classes are represented by your numbered class files.



回答4:

Every class in java belongs to a .java-file, but a .java-file can contain multiple classes. That includes inner and anonymous classes. The .class-files generated for inner classes contain a '$' in their name. Anonymous inner classes get numbers.



回答5:

To add to the answers above, this is another good example of generated inner classes based on Comparators (each Comparator is compiled in a different MyClass$X.class):

public class MyClass {
    ...

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

    ...
}


回答6:

If there is one X.java file and if it contains 4 collections.sort() {} then after compilation X.class,X$1.class,X$2.class,X$3.class,X$4.class will get generated.

In case of inner class and static inner class more .class files get generated.



回答7:

More than one class will be generated on compilation, Only if your class is having inner class.

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



标签: java class javac