2011-12-18 8 views
8

四半期オブジェクトでprintlnメソッドを使用すると、なぜtoStringメソッドの値が返されるのか分かりません。なぜ私は戻り値を取得している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(); 
    } 
} 
+1

四半期オブジェクトの文字列表現は何ですか?あなたはあなたのオブジェクトを印刷するようjavaに指示することはできません。 – Mead3000

答えて

3

PrintStream.printlnObjectを受け取るオーバーロードがあり、そのtoStringメソッドを呼び出すため。

1

これはこの関数の働きで、プリミティブ型をフォーマットしますが、オブジェクトを渡すと.toString()が呼び出されます。

あなたはそれを上書きしない場合は、それが出力本当に便利ではありませんデフォルト.toString()実装([email protected]が)...デフォルトで

あなたが直接オブジェクトを印刷しようとしている
+0

ああ私は見る!私はそれを知らなかった。したがって、printlnメソッドの引数にオブジェクトを渡すと、デフォルトでそのオブジェクトのtostringメソッドが呼び出されます。それは有用ではないように見えますし、「あなたがそれを呼び出さない限り、あなたはメソッドを使わない」ということについて私が学んだことと矛盾します。しかし、printlnメソッドに関する情報をありがとう。 printlnメソッドがそのようなtostringメソッドを呼び出すのはむしろ卑劣なようです。 –

+0

@NicholasKong: "あなたがそれを呼び出さない限りメソッドを使わない";これはオーバーライドしないメソッドに対してのみ当てはまります。 'toString'はベースクラスのメソッドのオーバーライドです。したがって、ベースクラスへの参照を取得することで呼び出すことができます。 –

+0

さて、おそらく、0で終わる 'char *'としてすべてを試して印刷するCバージョンを好むかもしれませんか? :p – fge

1

、それが呼び出すされますtoStringメソッドでは、そのクラスの属性を出力するには、そのtoStringメソッドをオーバーライドする必要があります。私はundestand何Javaのドキュメントへの参照のうえで

17

は、あなたがしてプリント(OBJ)/のprintln(OBJ)メソッドのPrintStreamクラスを呼び出すと

が内部でそれがStringとしてarguementと方法ライトと呼ばれる、ということです。 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(); 
} 
0

javaのすべてのクラスはjava.lang.Objectのサブクラスなので、オブジェクトを出力するためにSystem.out.println()メソッドを呼び出そうとするたびに、ObjectクラスのtoString()メソッドが呼び出されます。セキュリティのために

は方法は、ハッシュコードではなく、そのオブジェクトの値を出力 いますが、あなたのクラスでそのメソッドを継承しており、オブジェクトを印刷するには、その定義を拡張だから、あなたがリターンを得る

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

値の理由値。

関連する問題