为什么 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,无论调用者长什么样。

推荐:继续阅读并关注