java - 任何人都可以解释以下代码的工作......?

标签 java interface abstract-class anonymous-class

任何人都可以解释以下代码的工作原理......?

interface myInterface{}

public class Main {

    public static void main(String[] args) {

        System.out.println(new myInterface(){public String toString(){return "myInterfacetoString";}});

        System.out.println(new myInterface(){public String myFunction(){return "myInterfacemyFunction";}});
    }
}

输出是...

myInterfacetoString
primitivedemo.Main$2@9304b1

所有答案都说 println() 语句中的 myInterface 是匿名类。但是因为我已经将它声明为一个接口(interface),为什么它允许我创建同名的匿名类......?

再次...如果这些是匿名类,那么 main 类应该允许我为这些匿名类提供任何名称..但是如果尝试这样做..我会遇到编译错误

最佳答案

当您打印出一个对象时,它会调用 toString() 方法。在第一条语句中,您创建了一个新对象并覆盖了名为 toString 的方法。因此,打印对象时会调用此 toString() 方法。

在第二条语句中,您还创建了一个对象,但没有覆盖 toString() 方法,因此它将使用 Object 类的 toString() 方法。

对于新问题,这个链接对你的理解有很好的解释: Anonymous Classes

这是解释的副本:

new className(optional argument list){classBody}

此表达式从一个未命名且之前未定义的类中实例化一个新对象,该类自动扩展名为 className 的类,并且不能显式实现任何接口(interface)。新类的主体由 classBody 给出。

执行该表达式的结果是定义了一个扩展className的新类,实例化了一个新类的新对象,并且表达式替换为对新对象的引用

new interfaceName(){classBody}

此表达式从一个未命名且以前未定义的类实例化一个新对象,它自动实现名为interfaceName的接口(interface),并自动扩展名为 Object 的类。该类可以显式实现一个且仅一个接口(interface),并且不能扩展 Object 以外的任何类。新类的主体再次由 classBody 给出。

你现在清楚了吗?

关于java - 任何人都可以解释以下代码的工作......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978849/

相关文章:

java - 尽管类路径中有 jar 文件,但包 javax.ejb 不存在

c# - 从未知接口(interface)获取属性

C++ 抽象类型初始化

java - 读取 XML 文件需要很长时间

java - Java 中字节的 OR-ing 问题?

java - 从不同字符的字符串返回整数

javascript - 使用接口(interface) Typescript 扩展 Date 原型(prototype)

c# - 设计流畅的构建器以在 C# 中创建对象图

php - PHP 抽象静态类方法的替代模型

java - 我们是否需要在命名约定方面区分接口(interface)类和抽象类?