簡體   English   中英

為什么在打印對象時調用toString()方法?

[英]Why is the toString() method being called when I print an object?

我似乎無法理解為什么當我在quarter對象上使用println方法時,它返回toString方法的值。 我從來沒有調用過toString方法為什么我得到返回值?

public class Main {
    public static void main(String[] args) {
        Quarter q = new Quarter();
        Nickel n = new Nickel();
        System.out.println(q);
        System.out.println(n);
    }
}

public abstract class Money {
    private int value;

    public Money(int v) {
        value=v;
    }

    public abstract int getValue();

    protected int myValue() {
        return value;
    }

    public abstract String toString();
}

public abstract class Coin extends Money {
    public Coin(int value) {
        super(value);
        System.out.println("I am a coin, my value is " + getValue());
    }
}

public class Quarter extends Coin {
    public Quarter () {
        super(25);
    }

    public int getValue() {
        return myValue();
    }

    public String toString() {
        return "A Quarter is "+getValue();
    }
}

public class Nickel extends Coin {
    public Nickel () {
        super(5);
    }

    public int getValue() {
        return myValue();
    }

    public String toString() {
        return "A "+this.getClass().getName()+ " is "+getValue();
    }
}

在參考java文檔我不知道的是,

當你調用PrintStream類print(obj)/ println(obj)方法然后在內部調用write方法時,arguement為String.valueOf(obj),如下所示:

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

現在String.valueOf(obj)執行調用String方法的任務,如下所示:

 /**
 * Returns the string representation of the <code>Object</code> argument.
 *
 * @param   obj   an <code>Object</code>.
 * @return  if the argument is <code>null</code>, then a string equal to
 *          <code>"null"</code>; otherwise, the value of
 *          <code>obj.toString()</code> is returned.
 * @see     java.lang.Object#toString()
 */
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

因為PrintStream.println有一個帶有Object的重載,然后調用它的toString方法。

當您直接嘗試打印對象時,默認情況下它將調用toString方法,您需要覆蓋該toString方法以打印類的屬性。

因為這就是這個函數的運作方式:它為你格式化了原始類型,但是當你傳遞一個對象時,它會在它上面調用.toString()

如果你不覆蓋它,它將輸出默認的.toString()實現( Class@somenumber ),這實際上並沒有用......

因為java中的所有類都是java.lang.Object的子類,所以每當你嘗試調用System.out.println()方法來打印對象時,它都會調用Object類的toString()方法。

對於安全原因,該方法打印哈希碼,而不是該對象的值,但您已在類中繼承該方法並將其定義擴展為打印對象值

public String toString() {
        return "A Quarter is "+getValue();
    }

所以你得到一個返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM