2011-12-18 21 views
8

मुझे समझ में नहीं आ रहा है कि जब मैं तिमाही ऑब्जेक्ट पर 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(); 
    } 
} 
+1

आपको लगता है कि आपकी तिमाही वस्तु का स्ट्रिंग प्रस्तुति क्या है? आप अपने ऑब्जेक्ट को प्रिंट करने के लिए जावा को बस नहीं बता सकते हैं। – Mead3000

उत्तर

3

क्योंकि PrintStream.println एक अधिभार है कि एक Object लेता है, और उसके बाद अपने toString प्रणाली को बुलाती है।

1

क्योंकि यह फ़ंक्शन इस प्रकार काम करता है: यह आपके लिए आदिम प्रकारों को प्रारूपित करता है, लेकिन जब आप इसे ऑब्जेक्ट पास करते हैं, तो यह .toString() पर कॉल करेगा।

आप इसे ओवरराइड नहीं करते हैं, यह उत्पादन डिफ़ॉल्ट .toString() कार्यान्वयन ([email protected]) जो वास्तव में उपयोगी नहीं है ...

+0

ओह मैं देखता हूँ! मुझे नहीं पता था। इसलिए यदि मैं println विधि के तर्कों में कोई ऑब्जेक्ट पास करता हूं तो मैं डिफ़ॉल्ट रूप से उस ऑब्जेक्ट की टोस्टिंग विधि को कॉल करूंगा। यह उपयोगी प्रतीत नहीं होता है और यह "मैं एक विधि का उपयोग नहीं करता जब तक कि आप इसे कॉल नहीं करते" के बारे में सीखते हैं। लेकिन println विधि के बारे में जानकारी के लिए धन्यवाद। ऐसा लगता है कि प्रिंटल विधि के लिए टॉस्ट्रिंग विधि को कॉल करने के लिए यह बदसूरत लगता है। –

+0

@ निकोलसकॉन्ग: "जब तक आप इसे कॉल नहीं करते हैं तब तक आप एक विधि का उपयोग नहीं करते हैं"; यह गैर-ओवरराइड विधियों के लिए केवल सत्य है। 'toString' बेस-क्लास विधि का ओवरराइड है, और इसलिए उन चीजों द्वारा बुलाया जा सकता है जो बेस क्लास का संदर्भ लेते हैं। –

+0

ठीक है, शायद आप सी संस्करण पसंद करते हैं जो 0-समाप्त 'char *' के रूप में सब कुछ कोशिश करता है और प्रिंट करता है? : पी – fge

1

जब आप सीधे एक वस्तु मुद्रित करने के लिए कोशिश कर रहे हैं, डिफ़ॉल्ट रूप से यह फोन होगा toString विधि जो आपको अपनी कक्षा के गुणों को मुद्रित करने के लिए toString विधि को ओवरराइड करने की आवश्यकता है।

17

बात पर जावा डॉक्स मैं क्या समझने के लिए है कि,

जब आप PrintStream वर्ग प्रिंट (obj)/println (obj) विधि तो आंतरिक रूप से यह लिखने स्ट्रिंग के रूप में तर्क के साथ विधि कहा जाता है कहते हैं। valueOf (obj) नीचे दिखाया गया है:

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

अब String.valueOf (obj) जिन्हें आप नीचे देख स्ट्रिंग विधि के लिए बुला का कार्य करता है:

/** 
* 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.lang.Object की उपवर्गों हैं, इसलिए जब भी आप वस्तु मुद्रित करने के लिए println() विधि कॉल करने का प्रयास करें, यह वस्तु वर्ग की विधि toString() कहते हैं।

सुरक्षा के लिए कारणों विधि एक hashCode, उस वस्तु की नहीं मान, प्रिंट, लेकिन आप अपने वर्ग में है कि विधि विरासत में मिला है और वस्तु को महत्व देता

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

तो तुम एक लाभ दिलाने के मुद्रित करने के लिए इसकी परिभाषा का विस्तार मूल्य।

संबंधित मुद्दे