仅通过呈现对象名称调用的类方法

时间:2013-05-30 16:11:24

标签: java object methods

我有以下代码

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());

感谢您的任何澄清

2 个答案:

答案 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    }