Why does Java code with an inner class generates a third SomeClass$1.class file? [duplicate]

Solution 1:

The SomeClass$1.class represent anonymous inner class

hava a look at the anonymous inner class section here

Solution 2:

You'll also get something like SomeClass$1.class if your class contains a private inner class (not anonymous) but you instantiate it at some point in the parent class.

For example:

public class Person {

    private class Brain{
        void ponderLife() {
            System.out.println("The meaning of life is...");
        }
    }

    Person() {
        Brain b = new Brain();
        b.ponderLife();
    }
}

This would yield:

Person.class
Person$Brain.class
Person$1.class

Personally I think that's a bit easier to read than a typical anonymous class especially when implementing a simple interface or an abstract class that only serves to be passed into another local object.

Solution 3:

to build up on hhafez : SomeClass$1.class represents anonymous inner classes. An example of such a class would be

public class Foo{
  public void printMe(){
    System.out.println("redefine me!");
  }
}


public class Bar {
    public void printMe() {
    Foo f = new Foo() {
        public void printMe() {
        System.out.println("defined");
        }
    };
    f.printMe();
    }
}

From a normal Main, if you called new Bar().printMe it would print "defined" and in the compilation directory you will find Bar1.class

this section in the above code :

    Foo f = new Foo() {
        public void printMe() {
        System.out.println("defined");
        }
    };

is called an anonymous inner class.