当前位置: 首页 > 知识库问答 >
问题:

为什么this.getClass给出它自己的类名而不是匿名类名?

诸葛卜霸
2023-03-14

我通过在public static void main()方法中实现接口I创建了匿名类。因此,Java8对于抽象方法test()的实现是从C类的imple()方法中提供的。

因此,在public static void main()方法printing_interface.getclass(),我得到了

但最终它打印的是package_path.C(告诉我C是类名)。这怎么可能?不应该再次打印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();
    }
}

共有1个答案

麻华辉
2023-03-14

希望这能帮助您理解,当您声明

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 

建议:继续阅读,在Java中使用lambda表达式有任何运行时的好处吗?

 类似资料:
  • 问题内容: 在Java 7和更高版本中,菱形通常可以像这样毫无问题地用于推断类型: 但是,它不能用于这样的匿名内部类: 为什么是这样?从逻辑上讲,在这种情况下,我绝对可以将类型推断为。做出该决定的逻辑上的理由是,实际上不能在匿名内部类上推断类型,还是出于其他原因而将其省略了? 问题答案: 在JSR-334中: 不支持将Diamond与匿名内部类一起使用,因为这样做通常需要扩展类文件签名属性以表示不

  • 问题内容: 就在今天,我需要一种在不同对象之间传递函数的方法。我很快了解到您不能直接在Java中做到这一点,但是您可以传递一个wht实例,该实例显然被称为“匿名内部类”,如下所示: 定义类: 使其成为一个实例: 并称之为: 很简单。但是我不明白的是为什么它被称为“匿名”。我不只是给它起名字MyCallback吗?命名的东西不能匿名,对吗?请避免对这个术语感到困惑。 问题答案: 不,您说的是MyCa

  • 问题内容: 我正在阅读Java中的匿名类,它说您可以访问封闭类的方法,但不能访问局部变量。为什么会这样呢?我在说这个: 编辑:较旧的示例是不正确的,不能反映我的意思。根据在“访问封闭类的成员”一节中所写的内容,这应该是一个更好的示例,网址为http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html。 那么这个限制解决了什

  • 输出:类名:包。名称在这里B 有人能告诉我为什么匿名类类型在getClass()方法中给出封闭类吗?这导致了问题的出现。对象C上的equals()始终失败。我的理解是,由于getClass提供了封闭类名,所以永远不会调用重写的equals?

  • 问题内容: 这段代码: 印刷品: 我就是价值 但是,此代码: 导致编译错误: 为什么在我使用final类而不是隐式final枚举的同时,创建对我来说似乎是匿名子类的类,覆盖该方法,却抛出了编译时错误? 更具体地说,为什么可以覆盖中的任何内容?我对代码有印象 大致相当于 在这种情况下,匿名性质是不允许的。 有什么不同?为什么枚举很特别? 问题答案: 根据JLS: 枚举类型是隐式最终的,除非它包含至少

  • 问题内容: 根据JLS: 15.9.5匿名类声明编译器会自动从类实例创建表达式派生匿名类声明。 匿名类从不抽象(第8.1.1.1节)。匿名类始终是内部类(第8.1.3节);它永远不是静态的(第8.1.1节,第8.5.2节)。 匿名类始终是隐式最终的(第8.1.1.2节) 。 这似乎是一个特定的设计决定,所以它有一定的历史。 如果我选择上这样的课: 如果选择的话,为什么不允许我再次对其进行子类化?