Search code examples
javainner-classesanonymous-class

Anonymous inner class - getClass()


I have written the following code:

public class AnonymousClasses {

    public void sayHello(){

    }


public interface GreetingModule {
    public void sayHello();
}

public static void main(String[] args) {
    AnonymousClasses jonny = new AnonymousClasses(){
        @Override
        public void sayHello() {
            System.out.println("Hey");
        }
    };
    AnonymousClasses john = new AnonymousClasses(){
        @Override
        public void sayHello() {
            System.out.println("Hi");
        }
    };


    GreetingModule greeting = new GreetingModule() {

        @Override
        public void sayHello() {
            System.out.println("Hello");
        }


    };

    jonny.sayHello();
    john.sayHello();
    greeting.sayHello();

    System.out.println(jonny.getClass());
    System.out.println(john.getClass());
    System.out.println(greeting.getClass());

}

The output is of course:

Hey

Hi

Hello

class AnonymousClasses$1

class AnonymousClasses$2

class AnonymousClasses$3

However, when I edit my code as follows:

public class AnonymousClasses {

    private final GreetingModule greetingModule;

    public AnonymousClasses(GreetingModule greetingModule) {

        this.greetingModule = greetingModule;
    }

    public void saySomething() {
        greetingModule.sayHello();
    }


public interface GreetingModule {
    public void sayHello();
}

public static void main(String[] args) {
    AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
        @Override
        public void sayHello() {
            System.out.println("Hey");
        }
    });
    AnonymousClasses john = new AnonymousClasses(new GreetingModule(){
        @Override
        public void sayHello() {
            System.out.println("Hi");
        }
    });


    GreetingModule greeting = new GreetingModule() {

        @Override
        public void sayHello() {
            System.out.println("Hello");
        }


    };

    jonny.saySomething();
    john.saySomething();
    greeting.sayHello();

    System.out.println(jonny.getClass());
    System.out.println(john.getClass());
    System.out.println(greeting.getClass());

}

the output is:

Hey

Hi

Hello

class AnonymousClasses

class AnonymousClasses

class AnonymousClasses$3

Can somebody explain me, why there is no name of the inner class with a dolar in the first two getClass() methods? Is it still an inner class?


Solution

  • You are creating instances of the class on the second sample:

    AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
        @Override
        public void sayHello() {
            System.out.println("Hey");
        }
    });
    

    To create a anonymous subclass of it would like:

    AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
        @Override
        public void sayHello() {
            System.out.println("Hey");
        }
    }) {
          // Overriding anything here is optional
    };