代码之家  ›  专栏  ›  技术社区  ›  Burkhard

toString的显式调用与隐式调用

  •  33
  • Burkhard  · 技术社区  · 17 年前

    例如:

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

    而不是:

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

    除了空的情况,还有什么不同吗?
    后者能起作用吗,而前者不行?


    在隐式调用的情况下,具体执行什么操作?

    5 回复  |  直到 17 年前
        1
  •  59
  •   Dustin    17 年前

    没什么区别。使用较短且更有效的。

    如果出于其他原因确实希望获取对象的字符串值,并且希望该值为空友好型,请执行以下操作:

    String s = String.valueOf(obj);
    

    编辑 当前位置问题扩展了,所以我将扩展我的答案。

    在这两种情况下,它们编译为如下内容:

    System.out.println(new StringBuilder().append("obj: ").append(obj).toString());
    

    当你的 toString() 是隐式的,您将在第二个附加中看到。

    StringBuilder.append(Object)

    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }
    

    哪里 String.valueOf 看起来像这样:

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

    toString() StringBuilder :

    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
    

    所以…在这两种情况下都会发生非常相似的事情。一个人只需要多做一点工作。

        2
  •  3
  •   Blasanka    9 年前

    正如其他人所说,使用 "" + obj 方法

    根据 Java Language Spec :

    • "null"
    • new Boolean(X) 或者别的什么
    • toString() 被调用(或等效)
    • 如果 toString() null “空”
    • 连接字符串。
        3
  •  1
  •   cletus    17 年前

    没有区别,除了,就像你说的,零安全性。总是喜欢前者而不是后者。

        4
  •  1
  •   Pål GD    17 年前

        5
  •  0
  •   ceving    13 年前

    编写泛型引用类型非常容易。

    class ref
    {
      static public class Reference<T>
      {
        private T value;
        public Reference(T value) { set(value); }
        public Reference() { set(null); }
        public void set (T value) { this.value = value; }
        public T get () { return this.value; }
        public String toString() { return String.valueOf(this.value); }
      }
    
      static void fillString (Reference<String> str)
      {
        str.set("foo");
      }
    
      public static void main (String[] args)
      {
        Reference<String> str = new Reference<String>("");
        fillString(str);
        System.out.println (str);
      }
    }
    

    运行它将提供所需的输出:

    javac ref.java && java ref
    foo