interface TestA {
String toString();
}
public class Test {
public static void main(String args[]) {
System.out.println(new TestA() {
public String toString() {
return "test";
}
});
}
}
这将打印 test
作为输出。
toString()
更改为printString
时,它将打印
只是一个内存地址。解释它的工作原理。答案 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
实现。