我有以下代码
public class DriverTester {
public static void main(...){
// test empty constructor
Person p1 = new Person();
System.out.println("p1: " + p1);
}
}
public class Person {
private String name;
// Empty constructor
public Person () {
}
// getter avoided for simplicity
public String toString() {
return "Mr.or Ms. "+this.name;
}
}
它编译,成功运行并显示“Mr or Mrs null”。因此,这将是调用toString
方法的结果。
我不懂打印线方法的语法。如何简单地对象p1
的名称运行给定的方法。它如何知道运行哪种方法?语法不应该是
System.out.println("p1: " + p1.getName());
或
System.out.println("p1: " + p1.toString());
感谢您的任何澄清
答案 0 :(得分:4)
连接字符串时,例如在此行中:
System.out.println("p1: " + p1);
Java将调用toString()
方法将任何对象转换为String
以进行连接。 Java确保此方法存在于所有对象上,因为它是在Object
类上定义的,每个类都隐式继承该类。
此外,如果连接null
,则Java会将其转换为 String "null"
。
Java Language Specification, section 5.1.11,涵盖“字符串转换”:
- 如果引用为null,则将其转换为字符串“null”(四个ASCII字符n,u,l,l)。
- 否则,转换的执行就好像通过调用没有参数的引用对象的toString方法一样;但 如果调用toString方法的结果为null,那么 改为使用字符串“null”。
答案 1 :(得分:2)
PrintStream
uses String.valueOf
使用的 System.out.println
649 public void print(Object obj) {
650 write(String.valueOf(obj));
651 }
反过来使用对象的toString方法,前提是Object
本身不是null
,否则会返回文字"null"
。
2837 public static String valueOf(Object obj) {
2838 return (obj == null) ? "null" : obj.toString();
2839 }