为什么 this.getClass 给出自己的 class 名称而不是匿名的 class 名称?
Why does this.getClass give it's own class name rather than Anonymous class name?
我通过在 public static void main() 方法中实现接口 I 创建了匿名 class。所以,通过java 8 对于抽象方法test(),实现是由class C.
的imple()方法提供的
所以,在 public static void main() 方法中,打印 _interface.getClass(),我得到
package_path.Main$$Lambda$1/310656974 这绝对没问题。因为它打印的是匿名 class 名称。
此外,_interface 指向堆中的一个匿名对象,因此我正在做 _interface.test();
因此,test() 方法现在的第一个语句是打印 class 名称,
但最终打印出来的是,
package_path.C(告诉我 C 是 class 名称)。这怎么可能? package_path.Main$$Lambda$1/310656974 不应该再打印一遍吗?因为 'this' 在测试方法中意味着匿名对吗?
@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;
您实际上实现了类似于 () 的界面:
I _interface = new I() {
@Override
public void test() {
new C().imple(); // creating an instance of class `C` and calling its 'imple' method
}
};
因此,当 test
方法被调用时,它首先创建一个 C
的实例,它打印
class x.y.z.C
作为 class.
Because 'this' means anonymous inside the test method right?
现在,正如您在上面看到的,imple
中不再有匿名 class
正在被调用,因此 this
不再代表匿名 class。
正如 Holger 在评论中进一步阐明的那样,尽管在调用站点表示为 lambda 或匿名 class,class C
方法中的 this.getClass()
将计算结果为 C.class
,无论调用者长什么样。
推荐:继续阅读并关注
我通过在 public static void main() 方法中实现接口 I 创建了匿名 class。所以,通过java 8 对于抽象方法test(),实现是由class C.
的imple()方法提供的所以,在 public static void main() 方法中,打印 _interface.getClass(),我得到
package_path.Main$$Lambda$1/310656974 这绝对没问题。因为它打印的是匿名 class 名称。
此外,_interface 指向堆中的一个匿名对象,因此我正在做 _interface.test();
因此,test() 方法现在的第一个语句是打印 class 名称,
但最终打印出来的是, package_path.C(告诉我 C 是 class 名称)。这怎么可能? package_path.Main$$Lambda$1/310656974 不应该再打印一遍吗?因为 'this' 在测试方法中意味着匿名对吗?
@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;
您实际上实现了类似于 (
I _interface = new I() {
@Override
public void test() {
new C().imple(); // creating an instance of class `C` and calling its 'imple' method
}
};
因此,当 test
方法被调用时,它首先创建一个 C
的实例,它打印
class x.y.z.C
作为 class.
Because 'this' means anonymous inside the test method right?
现在,正如您在上面看到的,imple
中不再有匿名 class
正在被调用,因此 this
不再代表匿名 class。
正如 Holger 在评论中进一步阐明的那样,尽管在调用站点表示为 lambda 或匿名 class,class C
方法中的 this.getClass()
将计算结果为 C.class
,无论调用者长什么样。
推荐:继续阅读并关注