此打印声明如何工作?

时间:2018-11-14 04:31:00

标签: java

interface TestA {
    String toString();
}

public class Test {
    public static void main(String args[]) {
        System.out.println(new TestA() {
            public String toString() {
                return "test";
            }
        });
    }
}

这将打印 test 作为输出。

  1. 有人可以解释这是如何工作的吗?
  2. 当我将方法名称toString()更改为printString时,它将打印 只是一个内存地址。解释它的工作原理。

3 个答案:

答案 0 :(得分:3)

代码:

new TestA() {
    public String toString() {
        return "test";
    }
}

是一个匿名类,可以将其视为一种即时的类定义和实例化。此类的定义实现了toString()方法,该方法恰好返回字符串test。将该匿名类传递给System.out.println时,将导致打印test

如果将TestA#toString更改为TestA#printString,则将不再实现toString,Java的默认行为是打印哈希码。

答案 1 :(得分:2)

Object类定义一个方法toString(),该方法返回对象的“字符串表示形式”。基本方法返回类名和哈希码。

覆盖 toString()方法并返回更好的表示形式通常是个好主意。

Java中有许多东西可以调用对象的toString()方法。 System.out.println()是其中之一。串联到字符串(例如+)时,"hello " + myObj运算符是另一种常见的运算符。

在第一个示例中,您正在创建TestA接口的匿名内部类实例,并覆盖toString()。这意味着System.out.println()打印您定义的"test"字符串。

如果重命名该方法,现在只需获取Object的默认toString()实现,并获取“内存地址”版本。

答案 2 :(得分:1)

Object是Java中所有类的超类,它具有方法toString(),该方法可打印对象引用。
如果打印任何对象,则Java编译器会在内部调用该对象上的toString()方法。
在这里,您正在打印new TestA(),因此它在内部调用toString方法,您已经重写了该方法以打印test

但是,当您更改方法的名称时,它将调用toString类的Object实现。