2012-01-19 5 views
5

यह एक सरल कोडएक शून्य संदर्भ एक वर्ग का एक उदाहरण है? कैसे जावा जानता है कि पारित कर दिया अशक्त <code>Bar</code> और नहीं <code>Foo</code> है:

class Foo { 
} 

class Bar extends Foo { 
} 

public class Main { 

public static void main(String[] args) throws Exception { 
    fn(null); 
} 

static void fn(Foo f) { 
    System.out.println(f instanceof Foo ? "Foo" : "Bar"); 
} 
} 

मेरा प्रश्न है? मुझे पता है कि संकलक बार चुनता है और क्यों नहीं (क्योंकि फू से बार में और बार से foo तक रूपांतरण होता है और इसके विपरीत नहीं)। लेकिन इस विधि को कैसे पता चलेगा कि बार से आता है और नहीं? शून्य में ऑब्जेक्ट के बारे में कुछ जानकारी है जो असाइन की गई है?

+0

नल बार या फू नहीं हो सकता है। यह शून्य है। –

उत्तर

23

आप इसे गलत तरीके से पढ़ रहे हैं। instanceofहमेशा पर null संदर्भों के लिए मूल्यांकन करता है।

Java specification (जोर मेरा) से:

रन समय, instanceof ऑपरेटर का परिणाम सच है अगर RelationalExpression का मूल्य रिक्त नहीं है और संदर्भ डाली जा सकता है (§15.16) क्लासकास्ट अपवाद को उठाए बिना संदर्भ प्रकार में। अन्यथा परिणाम झूठा है।

+0

शायद अधिक क्योंकि 'शून्य' कोई उदाहरण नहीं है। हालांकि हर वर्ग को शून्य सौंपा जा सकता है। –

+0

+1 सही उत्तर। – apines

1

यह हमेशा गलत होता है। जावैक इसे जानता है।

लेकिन आप f.someStaticFunctionOfTheClassFoo() का उपयोग कर सकते हैं। तो, आपका प्रश्न बहुत दिलचस्प है, केवल इसे संपादित करने की आवश्यकता है।

+1

मुझे नहीं पता कि स्थैतिक विधियों का उल्लेख यहां कैसे उपयोगी है। –

1

क्या आप द्वारा

मतलब कैसे जावा जानता है इस अशक्त बार और नहीं Foo है कि करते हैं?

nullBar है और न ही Foo न है। देखें Java method dispatch with null argument

1

क्या एक शून्य संदर्भ एक वर्ग का उदाहरण है?

चलो इस बारे में स्पष्ट रहें। एक संदर्भ कुछ भी नहीं है। यह एक संदर्भ है। ऑब्जेक्ट यह को संदर्भित करता है, यदि कोई हो, तो कुछ वर्ग का उदाहरण है। लेकिन शून्य संदर्भ किसी भी वस्तु का संदर्भ नहीं देता है।

मेरा प्रश्न है: जावा कैसे जानता है कि पास की नल बार है और नहीं फू?

ऐसा नहीं है। आपका कार्यक्रम आपको झूठ बोला। यह संदर्भ "बार" प्रिंट करता है यदि संदर्भ Foo का एक उदाहरण देखें। आपके हिस्से पर खराब कोडिंग।

मुझे पता है कि क्यों संकलक बार चुनता है और नहीं फू (क्योंकि फू से बार में और बार से फू में रूपांतरण होता है और इसके विपरीत नहीं)।

कंपाइलर ने ऐसी कोई पसंद नहीं की है। आपके कोड ने खराब डिज़ाइन किया गया परीक्षण और प्रिंट किया था।

लेकिन यह तरीका कैसे पता चलेगा कि यह नल बार से आता है और नहीं?

ऐसा नहीं है। यह अनुमान लगाया। यह गलत हो गया।

शून्य में ऑब्जेक्ट के बारे में कुछ जानकारी है जो निर्दिष्ट है?

इसमें कोई जानकारी नहीं है।

+0

यह पता चला कि जब मैं इस सवाल से पूछा तो मैं बेवकूफ़ था :) –

+1

@ स्लिममान जेनीदी मैं सहमत होने के लिए इतनी चतुरता नहीं होगी, लेकिन हमेशा अपनी त्रुटियों को स्वीकार करने में सक्षम होना हमेशा अच्छा होता है। – EJP

0

शून्य एक विशेष प्रकार है और वह विशेष प्रकार "नलटाइप" है।

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