Man*_*DIP 5 java anonymous-class java-8 functional-interface
我通过在公共static void main()方法内实现接口I创建了匿名类。因此,通过Java 8的抽象方法test(),实现是从类C的imple()方法提供的。
因此,在public static void main()方法内部,打印_interface.getClass(),我得到了
package_path.Main $ $ Lambda $ 1/310656974这是绝对好的。因为它打印的是匿名类名。
另外,_interface指向堆中的匿名对象,因此我正在做_interface.test();。
因此,test()方法现在具有的第一条语句是打印类名称,
但是最终它显示的是package_path.C(告诉我C是类名)。那怎么可能?不应再次打印package_path.Main $$ Lambda $ 1/310656974吗?因为“这”意味着在测试方法内部是匿名的,对吗?
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助您理解,当您声明
I _interface = new C()::imple;
Run Code Online (Sandbox Code Playgroud)
您实际上实现的接口有点类似于(尽管不一样):
I _interface = new I() {
@Override
public void test() {
new C().imple(); // creating an instance of class `C` and calling its 'imple' method
}
};
Run Code Online (Sandbox Code Playgroud)
因此,当test调用该方法时,它首先创建一个C打印的实例
class x.y.z.C
Run Code Online (Sandbox Code Playgroud)
作为班级。
因为“this”在测试方法中意味着匿名,对吗?
现在,正如您在上面所看到的,不再有imple
从中调用的匿名类,因此this不再代表匿名类。
正如 Holger 在评论中进一步澄清的那样,尽管在调用站点上表示为 lambda 或匿名类,但无论调用者看起来如何,类this.getClass()的内部方法都C将计算为。C.class
推荐:继续阅读并关注在 Java 中使用 lambda 表达式是否有运行时优势?