【问题标题】:Class method called by only presenting object name仅显示对象名称调用的类方法
【发布时间】:2013-05-30 16:11:23
【问题描述】:

我有以下代码

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

感谢您的澄清

【问题讨论】:

  • 所有对象都是Object 类的子对象,该类具有toString() 方法。 println() 方法接受 Object。所以它知道它可以在参数上调用 toString()。字符串连接也是如此。
  • 每当在String 上下文中使用对象时,就像在println 中一样,它的toString() 方法就会被调用。你是对的,System.out.println("p1: " + p1.toString()) 会更详细和正确。

标签: java object methods


【解决方案1】:

连接字符串时,比如这一行:

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”。

【讨论】:

  • 很好的答案,但您可能想添加在 java.lang.Object 中定义的 toString(),以确保 Java 类型系统 (AFAIK) 中的每个类都至少具有基本实现。
  • 现在完全有意义 - 如果用户上下文中需要一个字符串并且没有调用特定方法,则运行 toString
【解决方案2】:

PrintStreamSystem.out.println uses String.valueOf 使用

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

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

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

【讨论】:

  • 非常感谢,完全有道理。感谢您分享知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
相关资源
最近更新 更多