tags:

views:

679

answers:

5

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.

+22  A: 

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)

Simon Nickerson
Terminology: not only "inner classes" but all "nested classes" are compiled to such files
Carlos Heuberger
True - I have updated the answer to reflect this
Simon Nickerson
+3  A: 

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.

skaffman
+1  A: 

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.

Mnementh
A: 

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

refer: http://stackoverflow.com/questions/380406/java-inner-class-class-file-names

Rakesh Juyal
Well, a source file can also contain separate, non-nested classes (if they're not public).
Michael Borgwardt
not ONLY if it is having inner classes (there are also anonymous classes,nested classes, ...).
Carlos Heuberger
+3  A: 

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.

Peter Kofler