2013-06-15 4 views
10

मैं एक काफी लंबे समय के लिए जावा के साथ काम किया है, और मैं सोच रहा था कि कैसे समारोह System.out.print() काम करता है।System.out.print() कैसे काम करता है?

यहाँ मेरी संदेह नहीं है:

एक समारोह होने के नाते, यह एक घोषणा कब पैकेज में कहीं नहीं है। लेकिन जावा डेवलपर्स ने ऐसा कैसे किया, क्योंकि यह फ़ंक्शन किसी भी तर्क और किसी भी तर्क प्रकार में ले सकता है इससे कोई फर्क नहीं पड़ता कि उन्हें कैसे व्यवस्थित किया जाता है? उदाहरण के लिए:

System.out.print("Hello World"); 
System.out.print("My name is" + foo); 
System.out.print("Sum of " + a + "and " + b + "is " + c); 
System.out.print("Total USD is " + usd); 

कोई फर्क नहीं पड़ता चर a, b, c, usd, foo या वे कैसे पारित कर रहे हैं, System.out.print() एक त्रुटि फेंकता है कभी नहीं की डेटाप्रकार है।

मेरे लिए, मैं किसी भी परियोजना जहां आवश्यकता इस तरह था पर काम नहीं किया है। बशर्ते, अगर मुझे इस तरह की आवश्यकता मिलती है, तो मुझे वास्तव में यह नहीं पता कि इसे कैसे हल किया जाए।

किसी को भी मेरे लिए व्याख्या कर सकते हैं कि यह कैसे हुआ?

+7

की बजाय एक त्रुटि है, क्योंकि 'System.out.print' ('PrintWriter') निश्चित रूप से आपकी लाइन 2 से 4 का समर्थन नहीं करता है, इसकी कोई विधि नहीं है। – SJuan76

+11

_System.out.print() कभी भी त्रुटि_ फेंकता नहीं है? खैर, आपके उदाहरण में, यह करता है, यह हर पंक्ति पर एक त्रुटि फेंकता है लेकिन पहले। कॉमा को 'System.out.print()' में स्वीकार नहीं किया जाता है, क्योंकि अल्पविरामों को विभिन्न मानकों को अलग करने के लिए उपयोग किया जाता है और 'System.out.print()' 1 पैरामीटर स्वीकार करता है .. स्ट्रिंग के बीच संगतता '+' ऑपरेटर का उपयोग करके किया जाता है । – BackSlash

+1

',' एक टाइपो है? '+' के बजाय? – pinkpanther

उत्तर

11

System.out सिर्फ PrintStream का एक उदाहरण है। आप इसकी JavaDoc देख सकते हैं। इसकी विविधता method overloading पर आधारित है (एक ही नाम के साथ कई विधियां, लेकिन विभिन्न मानकों के साथ)।

इस प्रिंट धारा इसके उत्पादन भेज रहा है ताकि standard output कहा जाता है।


अपने प्रश्न में आप एक तकनीक variadic functions कहा जाता है का उल्लेख (या varargs)। दुर्भाग्य है कि PrintStream#print द्वारा समर्थित नहीं है, तो आप कुछ और के साथ इस भूल जाना चाहिए। हालांकि जावा में इन्हें लागू करना बहुत आसान है। Just check the documentation.


और अगर आप उत्सुक कैसे जावा जानता गैर स्ट्रिंग चर "foo" + 1 + true + myObj श्रेणीबद्ध करने के लिए कैसे हैं, यह मुख्य रूप से एक जावा कम्पाइलर की जिम्मेदारी है।

जब concatenation में कोई चर शामिल नहीं है, तो कंपाइलर बस स्ट्रिंग को जोड़ता है। जब एक चर शामिल होता है, तो concatenation का अनुवाद StringBuilder#append श्रृंखला में किया जाता है। परिणामस्वरूप बाइट कोड में कोई संगतता निर्देश नहीं है; यानी + ऑपरेटर (स्ट्रिंग कॉन्सटेनेशन के बारे में बात करते समय) संकलन के दौरान हल किया जाता है।

जावा में सभी प्रकार की स्ट्रिंग के लिए परिवर्तित किया जा सकता (Boolean कक्षा में विधियों के माध्यम से Integer वर्ग, boolean में विधियों के माध्यम से int, अपने स्वयं के #toString के माध्यम से वस्तुओं, ...)। यदि आप रुचि रखते हैं तो आप स्ट्रिंगबिल्डर के स्रोत कोड की जांच कर सकते हैं।


अद्यतन: मैं अपने आप को उत्सुक था और (javap का प्रयोग करके) की जाँच की क्या मेरी उदाहरण System.out.println("foo" + 1 + true + myObj) में संकलित करता है। परिणाम:

System.out.println(new StringBuilder("foo1true").append(myObj).toString()); 
+0

पूर्ण होने के लिए कोई भी जोड़ सकता है जबकि तर्क अधिभार की अनुमति है, वापसी मूल्य अधिभार नहीं है। +1। – fge

+0

मुझे नहीं पता कि यह जवाब क्यों उखाड़ फेंक दिया गया था, क्योंकि यह गलत है। 'system.out.print' तर्कों की एक चर संख्या नहीं लेता है, यह केवल एक स्ट्रिंग लेता है। – Devolus

+2

@ डेवोलस शायद क्योंकि मैं कह रहा हूं कि यह * इसका समर्थन नहीं करता है? डाउनवॉटिंग से पहले कृपया पढ़ें। –

0

यह सब के बारे में Method Overloading

एक वस्तु का मुद्रण करता है और फिर लाइन समाप्त:

वहाँ println() method

में प्रत्येक डेटा प्रकार के लिए अलग-अलग तरीकों आप वस्तु पार कर लेते हैं कर रहे हैं। मुद्रित ऑब्जेक्ट के स्ट्रिंग मान प्राप्त करने के लिए यह विधि पहले String.valueOf (x) पर कॉल करती है, फिर व्यवहार करती है जैसे कि यह प्रिंट (स्ट्रिंग) और फिर println() को आमंत्रित करती है।

यदि आप प्राचीन प्रकार पारित:

इसी आदिम प्रकार प्रणाली को बुलाती है

अगर आप स्ट्रिंग पारित:

इसी println (स्ट्रिंग एक्स) प्रणाली को बुलाती है

0

मुझे लगता है कि आप printf(String format, Object... args) विधि से उलझन में हैं। पहला तर्क स्वरूप स्ट्रिंग है, जो अनिवार्य है, बाकी आप Object एस की मनमानी संख्या उत्तीर्ण कर सकते हैं।

print() और println() विधियों दोनों के लिए ऐसा कोई अधिभार नहीं है।

2

भले ही ऐसा लगता है कि System.put.print...() तर्कों की एक परिवर्तनीय संख्या लेता है, यह नहीं है। यदि आप बारीकी से देखते हैं, तो स्ट्रिंग को बस संयोजित किया जाता है और आप किसी भी स्ट्रिंग के साथ ऐसा ही कर सकते हैं। एकमात्र चीज जो होती है वह यह है कि आप जिन वस्तुओं को पारित कर रहे हैं, वे toString() विधि को कॉल करके जावा द्वारा स्ट्रिंग में परिवर्तित हो जाते हैं।

आप ऐसा करने की कोशिश अगर यह असफल हो जायेगी:

int i = 0; 
    String s = i; 
    System.out.println(s); 

कारण है, क्योंकि यहाँ निहित रूपांतरण नहीं किया जाता है।

लेकिन यदि आप

int i = 0; 
    String s = ""+i; 
    System.out.println(s); 

यह काम करता है के लिए इसे बदल और इस जब System.put.print...() रूप में अच्छी तरह का उपयोग कर क्या होता है।

आप सी printf की तरह कुछ mimimc को जावा में बहस के परिवर्तनशील लागू करना चाहते हैं तो आप इसे इस घोषणा कर सकते हैं:

public void t(String s, String ... args) 
{ 
    String val = args[1]; 
} 

क्या यहाँ के साथ होता है कि तार की एक सरणी में पारित हो जाता है, प्रदान किए गए तर्क की लंबाई। यहां जावा आपके लिए टाइपिंग प्रकार कर सकता है।

आप वास्तव में एक printf तो चाहते हैं तो आप इस तरह यह करने के लिए है:

public void t(String s, Object ... args) 
{ 
    String val = args[1].toString(); 
} 

तो फिर तुम डाली या तदनुसार तर्क की व्याख्या करने के लिए होगा।

0

जब तक आप प्रिंट करना चुनते हैं तब तक आप किसी भी स्ट्रिंग में कनवर्ट कर सकते हैं।आवश्यकता बहुत सरल थी क्योंकि Objet.toString() एक डिफ़ॉल्ट गूंगा स्ट्रिंग वापस कर सकता है: package.classname + @ + object number

यदि आपकी प्रिंट विधि को XML या JSON क्रमबद्धता वापस करनी चाहिए, तो ToString() का मूल परिणाम स्वीकार्य नहीं होगा। भले ही विधि सफल हो।

यहाँ दिखाने के लिए कि जावा गूंगा

public class MockTest{ 

String field1; 

String field2; 

public MockTest(String field1,String field2){ 
this.field1=field1; 
this.field2=field2; 
} 

} 

System.out.println(new MockTest("a","b"); 

कुछ [email protected] प्रिंट होगा हो सकता है एक सरल उदाहरण है! भले ही आप केवल दो स्ट्रिंग सदस्य हैं और इस

[email protected]{"field1":"a","field2":"b"} 

मुद्रित करने के लिए लागू किया जा सकता है (या काफी है कि यह कैसे debbuger में दिखाई देता है)

0

यह समझना महत्वपूर्ण है कि कैसे सिस्टम काम करने के लिए एक बहुत ही संवेदनशील मुद्दा है। out.print। यदि पहला तत्व स्ट्रिंग है तो प्लस (+) ऑपरेटर स्ट्रिग कॉम्पेट ऑपरेटर के रूप में काम करता है। यदि पहला तत्व पूर्णांक प्लस (+) ऑपरेटर गणितीय ऑपरेटर के रूप में कार्य करता है।

public static void main(String args[]) { 
     System.out.println("String" + 8 + 8); //String88 
     System.out.println(8 + 8+ "String"); //16String 
    } 
0

जाहिर है, संकलक एक भ्रमित तरीके से बनाया गया था हालांकि संकलक डेवलपर्स ने सोचा था कि उन्होंने कुछ चतुरता जोड़ा है। वास्तव में जो सचमुच जोड़ना चाहिए वह पूरी तर्क को देखना और + ऑपरेटर को लगातार समझना है। उदाहरण के लिए, System.out.println(1+2+"hello"+3+4);3hello34

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