2012-02-26 8 views
16

सबसे पहले खेद है कि यह एक बहुत ही बुनियादी सवाल है और मैं प्रचार करता हूं कि मैं अभी भी एक कोड बंदर हूं। मुझे System.out.println() को स्पष्ट करने के लिए एक साक्षात्कार में पूछा गया था; मैं निम्नलिखित तरीकेबाहर()

//this class belongs to java.lang package 
class System{ 
    public static PrintStream out; 
} 
//this class belongs to java.io package 
class PrintStream{ 
public void println.. 
} 

मैं समझाया है कि System.out मान्य है के बाद से इस तरह से हम जावा में स्थैतिक चर का उपयोग है, और बाहर PrintStream की एक वस्तु है और इसलिए हम अपने तरीकों का उपयोग कर सकते बताया गया है, के रूप में

System.out.pritnln(); 

संक्षेप में वह मुझसे पूछा कार्यक्रम की एक ऐसी ही तरह अनुकरण करने के लिए, मैं पता लगाया है और यह काम नहीं किया, के बाद से System.out अशक्त लौटने

मेरे सवाल वस्तु जावा में instantiated जहां बाहर है ? यदि यह गलत नहीं है तो क्या यह एक पूर्वनिर्धारित वस्तु है। इसके लिए सावधानीपूर्वक स्पष्टीकरण क्या होना चाहिए।

तकनीकी रूप से हमें क्या कहना चाहिए? प्रिंटस्ट्रीम प्रकार के प्रकार का एक चर है या क्या इसे प्रिंटस्ट्रीम प्रकार के ऑब्जेक्ट के रूप में कहना चाहिए?

+1

"System.out वापस लौट रहा है" का क्या मतलब है? –

+0

मैंने कक्षा ए {स्थिर बी आउट} जैसे एक समान कार्यक्रम बनाया है; कक्षा बी {} मैंने System.out.println (A.out) को मुद्रित करने का प्रयास किया; जो शून्य वापस आ रहा है। – srk

उत्तर

20

कक्षा प्रारंभ होने पर System.out को null में प्रारंभ किया गया है। यह nullPrintStream() विधि System.java में सेट है, जो केवल null देता है।

जब जेवीएम शुरू हुआ है, तो यह initializeSystemClass() विधि को कॉल करता है। यह विधि native विधि setOut0() पर कॉल करती है जो out चर को उचित मान पर सेट करती है।

यह अजीब लग सकता है लेकिन यह निम्न कारणों से एक आवश्यक कार्य है:

  • out मूल्य को स्थिर सेट नहीं किया जा सकता है, क्योंकि System जरूरतों पहले भरी हुई वर्गों में से एक (PrintStream से पहले) किया जाना है।
  • outfinal होना चाहिए ताकि उसका मूल्य किसी उपयोगकर्ता द्वारा सीधे ओवरराइड नहीं किया जा सके।
  • out स्थिर रूप से सेट नहीं किए जा सकते हैं, और अंतिम है, हमें native विधि, setOut0() का उपयोग करके भाषा के अर्थशास्त्र को ओवरराइड करना होगा।

मुझे आशा है कि आपकी समझ में मदद मिलेगी।

6

System.out है एक सामान्य स्थिर विशेषता है, यह JVM द्वारा JVM आरंभीकरण के दौरान initializeSystemClass() विधि के माध्यम से स्थापित किया गया था। आप को भी बदल सकते हैं (हालांकि इसकी अनुशंसा नहीं की जाती है) बस System.setOut(printOutStream); पर कॉल करके, जहां printOutStream वह स्ट्रीम है जिसे आप मानक आउटपुट के रूप में उपयोग करना चाहते हैं।

यहां एक अच्छा article है जो यह बताता है कि System.out.println() कैसे काम करता है।

+1

वास्तविक रूप से 'आउट' को 'प्रारंभिक सिस्टम क्लास()' विधि के माध्यम से JVM द्वारा सेट किया गया है। – Jivings

+0

@ जिविंग्स धन्यवाद, मैंने अपना जवाब अपडेट किया। –

-7

System.out.println();

यहां println प्रिंटस्ट्रीम क्लास का एक ऑब्जेक्ट है। हम सीधे प्रिंटस्ट्रीम क्लास के लिए ऑब्जेक्ट नहीं बना सकते हैं। आउट सिस्टम वर्ग का एक वस्तु है। आउट सिस्टम कक्षा में फ़ील्ड कहा जाता है। सिस्टम को कॉल करते समय। अप्रत्यक्ष रूप से प्रिंटस्ट्रीम क्लास के लिए ऑब्जेक्ट बनाता है। इसलिए हम System.out.prontln() का उपयोग कर println() विधि को कॉल कर सकते हैं।

+7

* इस उत्तर में गलतियों के बहुत सारे * गिनने के लिए लगभग बहुत सारे हैं। नज़रअंदाज़ करना। –

+3

सुरेंद्र, println() एक वस्तु नहीं है लेकिन प्रिंटस्ट्रीम कक्षा का एक तरीका है। –

+2

आप सीधे प्रिंटस्ट्रीम कक्षा के लिए एक वस्तु बना सकते हैं। उदाहरण के लिए, http://docs.oracle.com/javase/1.5.0/docs/api/java/io/PrintStream.html#PrintStream%28java.io.File%29। –

0

ओरेकल जावा रनटाइम पुस्तकालयों में, यह मूल रूप से System वर्ग लोड हो रहा है पर registerNatives() देशी विधि है जो (क static प्रारंभकर्ता के माध्यम से) कहा जाता है का उपयोग कर instantiated है। हालांकि यह एक कार्यान्वयन विस्तार है।

आप System.out सीधे System.setOut() का उपयोग कर भी सेट कर सकते हैं।

+0

क्या यह सच है? चूंकि 'रजिस्टरनेट्स()' जेवीएम आंतरिक तरीकों के मूल तरीकों को जोड़ता है, मैंने इसे कभी भी चर को तुरंत चालू करने के लिए उपयोग नहीं किया है। – Jivings

4

println() -

मन में है कि साथ

, चलो इस टूट, डॉट ऑपरेटर के साथ शुरू करते हैं। जावा में, डॉट ऑपरेटर का उपयोग केवल विधियों और चर को कॉल करने के लिए किया जा सकता है ताकि हम जान सकें कि 'आउट' या तो एक विधि या चर होना चाहिए। अब, हम 'आउट' को वर्गीकृत कैसे करते हैं? खैर, 'आउट' संभवतः एक विधि नहीं हो सकता है क्योंकि इस तथ्य के कारण कि कोई भी ब्रांड्स नहीं है - '()' - 'आउट' के बाद, जिसका अर्थ यह है कि बाहर स्पष्ट रूप से एक विधि नहीं है जिसे लागू किया जा रहा है। और, 'आउट' किसी भी तर्क को स्वीकार नहीं करता है क्योंकि केवल विधियां तर्क स्वीकार करती हैं - आपको "System.out (2,3) .println" जैसी कुछ दिखाई नहीं देगी। इसका मतलब है 'आउट' एक चर होना चाहिए।

'आउट' को 'सिस्टम' वर्ग नाम के साथ ही बुलाया जा रहा है, और एक वर्ग (एक वस्तु) का उदाहरण नहीं है, तो हम जानते हैं कि 'आउट' एक स्थैतिक चर होना चाहिए, क्योंकि केवल स्थैतिक चर केवल वर्ग नाम के साथ बुलाया जाता है। तो अब हम जानते हैं कि 'आउट' सिस्टम क्लास से संबंधित स्थिर सदस्य चर है।

इस तथ्य को ध्यान में रखते हुए कि 'println()' स्पष्ट रूप से एक विधि है, हम सिस्टम.out.println() में 'आउट' को आगे वर्गीकृत कर सकते हैं। हमने पहले से ही तर्क दिया है कि 'आउट' कक्षा प्रणाली से संबंधित एक स्थैतिक चर है। लेकिन अब हम देख सकते हैं कि 'आउट' कक्षा का एक उदाहरण होना चाहिए, क्योंकि यह विधि 'println()' का आह्वान कर रहा है।

विचार प्रक्रिया जिसे किसी को उत्तर देने के लिए उपयोग करना चाहिए, जानबूझकर ऊपर दिखाया गया है। पहले से सटीक उत्तर जानने के बिना, आप जावा के कुछ बुनियादी ज्ञान को लागू करके लगभग अनुमानित पहुंच सकते हैं। अधिकांश साक्षात्कारकर्ता आपको यह जानने की उम्मीद नहीं करेंगे कि System.out.println() आपके सिर के शीर्ष पर कैसे काम करता है, लेकिन इसके बजाय आप अपने मूल जावा ज्ञान का उपयोग उस जवाब पर पहुंचने के लिए करेंगे जो सटीक है।

मूल प्रश्न का अधिक सटीक उत्तर यह है: सिस्टम क्लास के अंदर 'आउट' की घोषणा है जो 'सार्वजनिक स्थिर अंतिम प्रिंटस्ट्रीम आउट' की तरह दिखती है, और प्रिंसस्ट्रीम क्लास के अंदर 'println () 'जिसमें एक विधि हस्ताक्षर है जो इस तरह दिखता है:' public void println() '।

सिस्टम.आउट के विभिन्न टुकड़े यहां दिए गए हैं।println() वास्तव में इस तरह दिखते हैं:

//the System class belongs to java.lang package 

class System { 
    public static final PrintStream out; 
    //... 
} 

//the Prinstream class belongs to java.io package 
class PrintStream{ 
public void println(); 
//... 
} 
0

नेट और दस्तावेज़ीकरण के लिए भी जाने की आवश्यकता नहीं है। हम बस जाव java.lang कह सकते हैं। सिस्टम यह आपको सिस्टम वर्ग से संबंधित सभी स्थैतिक क्षेत्रों, विधि प्रोटोटाइप की सूची देता है। हम जावप का उपयोग करके किसी भी जावा क्लास का विवरण प्राप्त कर सकते हैं, बशर्ते आप जानते हैं कि इसका पैकेज और क्लासनाम सिस्टम क्लास में परिभाषित प्रिंटस्ट्रीम की सार्वजनिक स्थैतिक वस्तु है।

0

जब सिस्टम वर्ग प्रारंभ हो, वह अपने initializeSystemClass() प्रणाली को बुलाती है, यहाँ कोड है:

FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); 
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); 

इस कोड setOut0() एक देशी समारोह System.c में कार्यान्वित किया जाता है:

JNIEXPORT void JNICALL 
Java_java_lang_System_setOut0(JNIEnv *env, jclass cla, jobject stream) 
{ 
    jfieldID fid = 
     (*env)->GetStaticFieldID(env,cla,"out","Ljava/io/PrintStream;"); 
    if (fid == 0) 
     return; 
    (*env)->SetStaticObjectField(env,cla,fid,stream); 
} 

यह एक मानक जेएनआई कोड है जो सिस्टम.आउट को उस तर्क के लिए सेट करता है, यह विधि देशी विधि setOut0() को कॉल करती है जो आउट वैरिएबल को उचित मान पर सेट करती है।

System.out अंतिम है, इसका मतलब है कि इसे प्रारंभिक सिस्टम क्लास() में प्रारंभ करने में कुछ और सेट नहीं किया जा सकता है लेकिन देशी कोड का उपयोग करके अंतिम चर को संशोधित करना संभव है।

0

आउट ऑब्जेक्ट क्लास में परिभाषित प्रिंटस्ट्रीम क्लास ऑब्जेक्ट है। आउट सार्वजनिक, स्थैतिक और अंतिम के रूप में घोषित किया जाता है।

  • println() प्रिंटस्ट्रीम कक्षा का एक तरीका है।
  • println() विधि को ऑब्जेक्ट के साथ बुलाया जाता है।
  • आउट ऑब्जेक्ट को सिस्टम क्लास के साथ बुलाया जाता है।
संबंधित मुद्दे