coolchock:
He escrito el siguiente código:
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());
}
La salida es por supuesto:
Oye
Hola
Hola
clase AnonymousClasses $ 1
clase AnonymousClasses $ 2
clase AnonymousClasses $ 3
Sin embargo, cuando edito mi código de la siguiente manera:
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());
}
la salida es:
Oye
Hola
Hola
clase AnonymousClasses
clase AnonymousClasses
clase AnonymousClasses $ 3
¿Puede alguien explicar por qué no hay ningún nombre de la clase interna con un dolar en los dos primeros getClass () métodos? ¿Sigue siendo una clase interna?
Marcos Vasconcelos :
Va a crear instancias de la clase en la segunda muestra:
AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
@Override
public void sayHello() {
System.out.println("Hey");
}
});
Para crear una subclase anónima de que le gustaría:
AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
@Override
public void sayHello() {
System.out.println("Hey");
}
}) {
// Overriding anything here is optional
};