Java 为什么this.getClass会给它';谁有自己的类名而不是匿名类名?

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()方

我通过在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.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或匿名类,class
C
方法中的
this.getClass()
将计算为
C.class
,而不管调用方看起来如何


推荐:继续阅读并跟进

明白了,谢谢:)可能是方法参考,我无法理解。使用J7及以下匿名类的实现,事情变得很清楚:)@Naman您的示例意味着每次调用
test
时都会创建一个
C
的新实例,这是不正确的;它被缓存了…@Eugene True,我想它会更像
C=new C();I_接口=()->c.imple()。只是我为OP推导的点是为类
C
创建的新实例。这个答案有误导性。class
C
方法中的表达式
this.getClass()
将计算为
C.class
,而不管调用方看起来如何。但是在lambda表达式中出现
getClass()
也不会计算为匿名类,因为lambda表达式和匿名类并不等价。比如说
Supplier