Multiple .class files generated for a class?

15,266

Solution 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)

Solution 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.

Solution 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.

Solution 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.

Share:
15,266

Related videos on Youtube

Ariod
Author by

Ariod

Software engineer hailing from Zagreb, Croatia.

Updated on April 19, 2022

Comments

  • Ariod
    Ariod about 2 years

    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.

  • user85421
    user85421 almost 15 years
    Terminology: not only "inner classes" but all "nested classes" are compiled to such files
  • user85421
    user85421 almost 15 years
    not ONLY if it is having inner classes (there are also anonymous classes,nested classes, ...).
  • Sled
    Sled over 12 years
    Don't forget about anonymous classes. Technically they are already covered by "inner classes" but they don't always look like classes so people maybe surprised to see them appear. Also, the new Java 8 lambdas look like they will be generating additional classes when compiled.
  • Ran
    Ran over 5 years
    @SimonNickerson Is there any way avoid such external class file generation. I mean is there a way to force the compiler to produce all the classes in the same .class file.
  • sudhee_bsp
    sudhee_bsp over 3 years
    That means, will the Foo$1.class file be generated? even if we haven't used the "implements Helper" = Helper interface