2

我有以下一段代码

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方法的结果。

我不明白 print line 方法的语法。只是对象的名称如何p1运行给定的方法。它如何知道运行哪种方法?语法不应该是

System.out.println("p1: " + p1.getName());

或者

System.out.println("p1: " + p1.toString());

感谢您的任何澄清

4

2 回答 2

4

连接字符串时,例如在此行中:

System.out.println("p1: " + p1);

Java将调用该toString()方法将任何对象转换为a Stringfor concatenation。Java 确保此方法存在于所有对象上,因为它是在Object每个类隐式继承的类上定义的。

此外,如果 anull被连接,那么 Java 会将其转换为String "null"

Java 语言规范第 5.1.11 节介绍了“字符串转换”:

  • 如果引用为 null,则将其转换为字符串“null”(四个 ASCII 字符 n、u、l、l)。
  • 否则,转换就像调用被引用对象的 toString 方法一样执行,不带参数;但如果调用 toString 方法的结果为 null,则使用字符串“null”。
于 2013-05-30T16:14:41.567 回答
2

PrintStreamSystem.out.println 用途使用String.valueOf

649     public void print(Object obj) {
650         write(String.valueOf(obj));
651     }

如果本身不是,则反过来使用 Object 的toString方法,否则返回文字。Objectnull"null"

2837    public static String valueOf(Object obj) {
2838        return (obj == null) ? "null" : obj.toString();
2839    }
于 2013-05-30T16:16:25.943 回答