Java 为什么this.getClass会给它';谁有自己的类名而不是匿名类名?
我通过在publicstaticvoidmain()方法中实现接口I创建了匿名类。因此,对于抽象方法test(),java 8提供了类C的imple()方法的实现 所以,在publicstaticvoidmain()方法的内部,printing _interface.getClass(),我得到了 package_path.Main$$Lambda$1/310656974,绝对可以。因为它是匿名类名 另外,_接口指向堆中的匿名对象,因此我正在执行_interface.test() test()方法现在的第一条语句是打印类名 但最终它是什么, package_path.C(告诉我C是类名)。这怎么可能?是否应该再次打印package_path.Main$$Lambda$1/310656974?因为“这”意味着测试方法中的匿名,对吗Java 为什么this.getClass会给它';谁有自己的类名而不是匿名类名?,java,java-8,anonymous-class,functional-interface,Java,Java 8,Anonymous Class,Functional Interface,我通过在publicstaticvoidmain()方法中实现接口I创建了匿名类。因此,对于抽象方法test(),java 8提供了类C的imple()方法的实现 所以,在publicstaticvoidmain()方法的内部,printing _interface.getClass(),我得到了 package_path.Main$$Lambda$1/310656974,绝对可以。因为它是匿名类名 另外,_接口指向堆中的匿名对象,因此我正在执行_interface.test() test()方
@java.lang.FunctionalInterface
interface I {
void test();
}
class C {
void imple() {
System.out.println(this.getClass());
System.out.println("Inside Implementation");
}
}
class Main {
public static void main(String[] args) {
I _interface = new C()::imple;
System.out.println(_interface.getClass());
_interface.test();
}
}
希望这能帮助您理解,当您声明
I _interface = new C()::imple;
实际上,您已经实现了与()类似的接口:
因此,当调用test
方法时,它首先创建打印的C
实例
class x.y.z.C
作为班级的一员
因为“这”意味着测试方法中的匿名,对吗
@java.lang.FunctionalInterface
interface I {
void test();
}
class C {
void imple() {
System.out.println(this.getClass());
System.out.println("Inside Implementation");
}
}
class Main {
public static void main(String[] args) {
I _interface = new C()::imple;
System.out.println(_interface.getClass());
_interface.test();
}
}
现在,正如您在上面看到的,没有更多的匿名类可以从中执行imple
正在从调用,因此,此
不再表示匿名类
正如霍尔格在评论中进一步澄清的那样,尽管调用站点中表示为lambda或匿名类,classC
方法中的this.getClass()
将计算为C.class
,而不管调用方看起来如何
推荐:继续阅读并跟进明白了,谢谢:)可能是方法参考,我无法理解。使用J7及以下匿名类的实现,事情变得很清楚:)@Naman您的示例意味着每次调用
test
时都会创建一个C
的新实例,这是不正确的;它被缓存了…@Eugene True,我想它会更像C=new C();I_接口=()->c.imple()代码>。只是我为OP推导的点是为类C
创建的新实例。这个答案有误导性。classC
方法中的表达式this.getClass()
将计算为C.class
,而不管调用方看起来如何。但是在lambda表达式中出现getClass()
也不会计算为匿名类,因为lambda表达式和匿名类并不等价。比如说Supplier