2009-04-24 18 views
12

कुछ है कि मुझे उलझन में है बुला - एक उदाहरण:क्यों की जरूरत नहीं वर्ग के आयात किया जाता है जब उदाहरण पर विधि (जावा)

Thing.java:

import java.util.Date; 

class Thing { 
    static Date getDate() {return new Date();} 
} 

(एक ही पैकेज) TestUsesThing.java:

// not importing Date here. 

public class TestUsesThing { 

    public static void main(String[] args) { 
     System.out.println(Thing.getDate().getTime()); // okay 
     // Date date = new Date(); // naturally this wouldn't be okay 
    } 

} 

उनमें से किसी एक पर getTime() को कॉल करने में सक्षम होने के लिए दिनांक आयात करना आवश्यक क्यों नहीं है? इसलिए संकलक जानता है कि क्या एक Date आप टाइप यदि

Date date = new Date(); 

आयात सी/C++ #include पसंद नहीं है

+1

क्या आपका मतलब 'System.out.println (Thing.getDate()। GetTime());' – JeeBee

+0

@ जीबी: यह लिखित के रूप में काम करेगा, लेकिन आप सही हैं कि यह भ्रामक है (सभी चीजें एक ही तारीख होगी)। –

+0

ओह, धन्यवाद - सही किया गया है। getDate() एक इंस्टेंस विधि के रूप में शुरू हुआ और मैं लिखने के बाद कॉल को बदलना भूल गया। पोस्ट करने से पहले javac पिछले चीजों को चलाने के लिए सबक। – jjujuma

उत्तर

24

जावा में आयात कर रहा है केवल आवश्यक है, क्लासपाथ पर सभी प्रकार उपलब्ध हैं, लेकिन आप import उन्हें पूरी तरह योग्यता प्राप्त नाम लिखने से रोकने के लिए हैं। और इस मामले में, यह अनावश्यक है।

+0

आह जो पूर्ण ज्ञान देता है, धन्यवाद! – jjujuma

+0

+1: मैं स्वयं जावा और सभी सामग्री को पढ़ रहा हूं, मुझे यह याद नहीं है कि जानकारी के उस तरीके ने उस तरीके को समझाया। यह बहुत साफ हो जाता है। धन्यवाद। –

+0

अन्य कुछ हद तक संबंधित टिप्पणी यह ​​है कि सभी java.lang पैकेज स्वचालित रूप से आयात किया जाता है। तो इसका मतलब है कि आप आयात विवरण के बिना सिस्टम जैसी चीजों का उपयोग कर सकते हैं। –

1

अच्छा सवाल !!

मुझे लगता है कि परिणाम यह है कि जावा कंपाइलर अभिव्यक्ति बनाम बयान कैसे संभालता है के बीच अंतर है।

Date d = new Date(); // a statement 

के रूप में यह println विधि कॉल के अंदर होता है जहां

new Thing().getDate().getTime() 

के रूप में एक अभिव्यक्ति है। जब आप नई थिंग() पर GetDate को कॉल करते हैं तो संकलक थिंग क्लास के लिए प्रकार की जानकारी को देख कर अभिव्यक्ति को संभालने का प्रयास करता है, जहां वह दिनांक दिनांक की घोषणा प्राप्त करता है। लेकिन जब आप की तरह

Date d = new Thing().getDate(); 

आप वर्तमान क्षेत्र (वर्ग TestUsesThing) में एक प्रकार के परिणाम बताए जाते हैं एक बयान में अलग तिथि इस्तेमाल करने की कोशिश, संकलक कि दायरे के भीतर प्रकार को हल करने की कोशिश करता है। नतीजतन, आप अज्ञात प्रकार के लिए कंपाइलर त्रुटि देखते हैं।

0

क्या थिंग और टेस्टयूसेस एक ही पैकेज में हैं? यदि ऐसा है तो आपको चीज आयात करने की आवश्यकता नहीं है। आपको तिथि आयात करने का कारण यह है क्योंकि यह एक अलग पैकेज में है।

+0

हां, क्षमा करें, प्रश्न वास्तव में तिथि आयात के बारे में था, न कि कक्षाओं के बीच संबंध जो मैंने अब स्पष्ट किया है। – jjujuma

0

import विवरण कुछ चीजों के लिए उपयोग किया जाता है।

  1. कंपाइलर प्रकार की जांच और टकराव नामकरण से बचें।
  2. सुनिश्चित करता है बाइट कोड लिंकेज

जब भी हम कहते हैं कि

System.out.println(new Thing().getDate().getTime()) 

संकलक इस बयान बाएं से दाएं पार्स करके उस वर्ग में हो जाता है।

प्रथम स्तर संकलक पार्सिंग।

  1. जाओ बात वर्ग के लिए
  2. संकलन बात से कोई संबंध या ClassVersion त्रुटि नहीं है।कक्षा

  3. जांचें Thing.class कोडेट विधि मिल गई है।
  4. यदि # 3 अच्छा है तो संकलक सूचक अभी भी Thing.class (जिसमें दिनांक आयात विवरण है) में है और मैं समय विधि का आह्वान कर सकता हूं।
  5. उपभोक्ता टेस्टयूसेस के रूप में केवल लंबे चर हो जाता है।

    System.out.println(new Thing().getDate()) 
    

    5,1 इस मामले में हम परोक्ष .toString तक पहुँच रहे हैं में() विधि

0

वास्तव में, कि एक आदर्श उदाहरण था, के बाद से वहाँ दो अलग मानक जावा दिनांक वर्गों है: java.util डेट और जावा। वर्ग .डेट

यह कैसे पता चलेगा कि किस का उपयोग करना है? सरल। getDate() विधि बात वर्ग की परिभाषा के भाग के रूप में घोषित किया है, और उस घोषणा का हिस्सा अपनी returntype है:

public java.util.Date getDate() { 
    return this.date; 
} 
बेशक

, आप बात वर्ग की परिभाषा में एक आयात अगर - और यह अस्पष्ट नहीं है, तो आप बस कहते हैं:

public Date getDate() { 

आप बात वर्ग के द्विआधारी डिकोड करने के लिए थे, तो आप getDate विधि की विधि हस्ताक्षर देखना चाहते हैं, और यह पूरी तरह से योग्य वर्ग के नाम (सहित, शामिल हैं पैकेज) वापसी प्रकार के।

एक आयात संकलक को यह बताने का एक तरीका है कि आप कौन सी पैकेज को स्पष्ट योग्यता के बिना कक्षाओं का जिक्र करते समय मानना ​​चाहते हैं। जब भी एक अयोग्य वर्ग का नाम देखा जाता है, तो आयात की सूची स्कैन की जाएगी, और पैकेजों की खोज की जाएगी। यदि कोई अस्पष्टता नहीं है (जैसे java.util.date और java.sql.Date दोनों आयात करना), उस वर्ग का उपयोग किया जाएगा। यदि आप कक्षा को पूरी तरह से निर्धारित कर सकते हैं, या यदि कक्षा का नाम पूरी तरह योग्य है, तो आपको आयात करने की आवश्यकता नहीं है।

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