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?
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
};