我写了以下代码:
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());
}
输出当然是:
嘿
你好
你好
class AnonymousClasses $ 1
class AnonymousClasses $ 2
class AnonymousClasses $ 3
但是,当我编辑我的代码时,如下所示:
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());
}
输出是:
嘿
你好
你好
class AnonymousClasses
class AnonymousClasses
class AnonymousClasses $ 3
有人可以解释一下,为什么在前两个getClass()方法中没有带有dolar的内部类的名称?它仍然是一个内在阶级?
您正在第二个示例上创建该类的实例:
AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
@Override
public void sayHello() {
System.out.println("Hey");
}
});
要创建它的匿名子类,请:
AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
@Override
public void sayHello() {
System.out.println("Hey");
}
}) {
// Overriding anything here is optional
};
当有一个新的未命名的类实现时,$ symbol附带类名。
在第一个示例中,您将在每种情况下创建AnonymousClasses的新实现。
AnonymousClasses jonny = new AnonymousClasses(){
@Override
public void sayHello() {
System.out.println("Hey");
}
};
它类似于使用AnonymousClasses作为父类创建子类的对象。在这种情况下,由于子类没有名称,JVM会将1美元附加到其父名称以创建唯一名称。
在第二个示例中,您只是创建具有相同AnonymousClasses实现的新对象。它可能看起来很相似,但如果您仔细注意,每次创建GreetingModule接口的新实现时都会传递给AnonymousClasses的构造函数。
在这两种情况下,都没有内部阶级。在第一个示例中,它们只是AnonymousClasses的子类的对象,在第二种情况下,它们是相同AnonymousClasses的对象。