匿名内部 class - getClass()
Anonymous inner class - getClass()
我写了下面的代码:
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 匿名类
class 匿名类
class AnonymousClasses$3
谁能解释一下,为什么在前两个 getClass() 方法中没有带有 dolar 的内部 class 的名称?还是内在的class?
您正在为第二个示例创建 class 的实例:
AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
@Override
public void sayHello() {
System.out.println("Hey");
}
});
要创建它的匿名子class,需要:
AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
@Override
public void sayHello() {
System.out.println("Hey");
}
}) {
// Overriding anything here is optional
};
当有 class. 的新未命名实现时,$ 符号带有 class 名称
在第一个示例中,您将在每种情况下创建 AnonymousClasses 的新实现。
AnonymousClasses jonny = new AnonymousClasses(){
@Override
public void sayHello() {
System.out.println("Hey");
}
};
这类似于创建子class 的对象,以 AnonymousClasses 作为父 class。在这种情况下,由于子class没有名称,JVM 将 $1 附加到其父名称以创建唯一名称。
在第二个示例中,您只是创建了 AnonymousClasses 相同实现的新对象。它可能看起来很相似,但如果你仔细观察,每次你都在创建一个新的 GreetingModule 接口实现,它被传递给 AnonymousClasses 的构造函数。
在这两种情况下,都没有内部class。在第一个示例中,它们只是 AnonymousClasses 的 subclasses 的对象,在第二种情况下,它们是相同 AnonymousClasses.
的对象
我写了下面的代码:
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 匿名类
class 匿名类
class AnonymousClasses$3
谁能解释一下,为什么在前两个 getClass() 方法中没有带有 dolar 的内部 class 的名称?还是内在的class?
您正在为第二个示例创建 class 的实例:
AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
@Override
public void sayHello() {
System.out.println("Hey");
}
});
要创建它的匿名子class,需要:
AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
@Override
public void sayHello() {
System.out.println("Hey");
}
}) {
// Overriding anything here is optional
};
$ 符号带有 class 名称
在第一个示例中,您将在每种情况下创建 AnonymousClasses 的新实现。
AnonymousClasses jonny = new AnonymousClasses(){
@Override
public void sayHello() {
System.out.println("Hey");
}
};
这类似于创建子class 的对象,以 AnonymousClasses 作为父 class。在这种情况下,由于子class没有名称,JVM 将 $1 附加到其父名称以创建唯一名称。
在第二个示例中,您只是创建了 AnonymousClasses 相同实现的新对象。它可能看起来很相似,但如果你仔细观察,每次你都在创建一个新的 GreetingModule 接口实现,它被传递给 AnonymousClasses 的构造函数。
在这两种情况下,都没有内部class。在第一个示例中,它们只是 AnonymousClasses 的 subclasses 的对象,在第二种情况下,它们是相同 AnonymousClasses.
的对象