Java 仅通过显示对象名调用的类方法

Java 仅通过显示对象名调用的类方法,java,object,methods,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 pub

我有下面的代码

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或Mrs null”。因此,这将是调用
toString
方法的结果

我不理解print line方法的语法。对象名
p1
如何运行给定的方法。它如何知道要运行哪个方法?语法不应该是

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


感谢您在连接字符串时所做的任何澄清,例如在此行中:

System.out.println("p1: " + p1);
Java将调用
toString()
方法将任何对象转换为
字符串
,以进行连接。Java确保此方法存在于所有对象上,因为它是在类上定义的,每个类都隐式继承自该类

另外,如果连接了
null
,那么Java将把它转换成字符串
“null”

其中,包括“字符串转换”:

  • 如果引用为null,则将其转换为字符串“null”(四个ASCII字符n、u、l、l)
  • 否则,转换就好像是通过调用引用对象的toString方法(不带参数)来执行的;但是 如果调用toString方法的结果为null,则 改为使用字符串“null”

PrintStream
System.out.println使用

如果
对象本身不是
null
,则反过来使用对象的方法,否则返回文本
“null”

2837    public static String valueOf(Object obj) {
2838        return (obj == null) ? "null" : obj.toString();
2839    }

所有对象都是具有
toString()
方法的
Object
类的子对象。
println()
方法接受一个
对象。因此它知道可以对参数调用toString()。字符串连接也是如此。每当在
字符串
上下文中使用对象时,就像在
println
中一样,就会调用它的
toString()
方法。您在
System.out.println(“p1:+p1.toString())
中是正确的。答案不错,但您可能希望添加
toString()
java.lang.Object
中定义,确保java类型系统中的每个类(AFAIK)至少有一个基本的实现。现在完全有意义了-如果用户上下文中需要一个字符串,并且没有调用特定的方法,那么toString就可以运行了。非常感谢,这是完全有意义的。谢谢你分享知识。
649     public void print(Object obj) {
650         write(String.valueOf(obj));
651     }
2837    public static String valueOf(Object obj) {
2838        return (obj == null) ? "null" : obj.toString();
2839    }