2009-08-26 18 views

उत्तर

33

जावा में पैकेज घोंसला नहीं हैं।

जब आप import java.awt.*, आप केवल सभी वर्गों और इंटरफेस है कि पैकेज java.awt में हैं आयात कर रहे हैं - आप कर रहे हैं नहीं ऐसे java.awt.event के रूप में सभी संकुल कि java.awt तहत कर रहे हैं, आयात।

भले ही ऐसा लगता है कि पैकेजों को नेस्टेड किया गया है (यानी, ऐसा लगता है कि java.awt.eventjava.awt का "सबपैकेज" है, यह वास्तव में मामला नहीं है। आपको और java.awt.event को दो अलग-अलग, असंबंधित पैकेजों के रूप में मानना ​​चाहिए जो उनके नामों में एक आम हिस्सा हैं।

+1

यह सच नहीं है कि आयात java.awt। * स्वचालित रूप से java.awt.event आयात करता है? –

+15

नहीं - वह जेस्पर का मुद्दा था। आयात java.awt। *; प्रत्येक वर्ग का आयात करता है जिसका पैकेज बिल्कुल java.awt है। यह किसी भी वर्ग को आयात नहीं करता जिसका पैकेज केवल जावा के साथ शुरू होता है। – Sbodd

5

जावावाट पैकेज (लेकिन इसके उप-पैकेज नहीं) से पहले आयात आयात प्रकार, और अन्य आयात केवल java.awt.event (लेकिन किसी भी अन्य पैकेज से नहीं) से हैं।

जबकि जावा में पैकेज पदानुक्रम में व्यवस्थित (और होना चाहिए) हो सकता है, आयात कथन "रूढ़िवादी" होता है - जब आप उस पैकेज के भीतर से सभी प्रकार के आयात करते हैं, तो आप केवल उस स्तर पर विशेष रूप से उन लोगों को प्राप्त करते हैं, न कि पदानुक्रम में निचले स्तर पर।

मुझे लगता है कि इसके पीछे तर्क नकली आयात से बचने के लिए है। युग्मन, निर्भरता, और अस्पष्टताओं से बचने के लिए, केवल उतनी ही कम आवश्यकताएं आयात करने के लिए एक अच्छा विचार है - उदाहरण के लिए, यदि किसी नाम के साथ संघर्ष में नाम के साथ पैकेज में कोई नई कक्षा जोड़ा जाता है तो क्या होता है एक और पैकेज?)। यही कारण है कि यदि आप अपने आयात को व्यवस्थित करने के लिए ग्रहण का उपयोग करते हैं, तो यह वास्तव में तारांकन संस्करण के अंदर विशिष्ट आयात विवरण जोड़ देगा, भले ही इसका मतलब अतिरिक्त रेखाएं हों। सबपैकेज में सबकुछ आयात करना और भी बदतर होगा, आपको वास्तव में सबकुछ मिल जाएगा।

इसके अतिरिक्त, एक सामान्य अभ्यास विशेष उद्देश्य कक्षाओं और कार्यान्वयन-विशिष्ट वर्गों को अपने स्वयं के उप-पैकेजों में रखना है। अक्सर, आप विशेष रूप से महत्वपूर्ण होने तक उन्हें आयात करने से बचना चाहते हैं। फिर, पूरे उपट्री आयात करना उस के साथ संघर्ष करेगा।

0

java.awt.* एक नियमित अभिव्यक्ति नहीं है, जो मुझे लगता है कि आप उम्मीद कर रहे हैं/सोच रहे हैं।

java.awt.* आपको केवल उस सटीक पैकेज में कक्षाएं देगा, न कि घोंसला वाले पैकेज। नीचे शामिल अंतरिक्ष टकराव नाम की कल्पना करो!

import com.* 

यह ध्यान देने योग्य है कि यह * उपयोग करने के लिए बुरा व्यवहार माना जाता है। कक्षा नाम आयात की व्याख्या करें पसंदीदा हैं।

आगे पढ़ने के लिए: Wikipedia: Namespace (Computer Science)

+0

आयात भी * समर्थित है? : -o – OscarRyz

+2

@ ऑस्कर रेयेस: नहीं, "आयात *" जावा में मौजूद नहीं है। – Jesper

+0

सहमत है, काम नहीं करता (जो वास्तव में मुझे आश्चर्य करता है)। मैं इसे बदल दूंगा ताकि किसी को भ्रमित न किया जा सके ... –

1

कई तरह से पहले कहा है।

आयात java.awt। * Java.awt.event में किसी भी कक्षा आयात नहीं करेगा ...

और उन दो पैकेज के बीच अंतर यह है कि java.awt है।* फ्रेम, बटन, आदि जैसे वर्गों को शामिल करें और java.awt.event। * पैकेज में सभी ईवेंट/श्रोता शामिल हो सकते हैं।

उदाहरण के लिए, एक बटन बनाने के लिए आपको कक्षा java.awt.Button की आवश्यकता है, लेकिन यदि आप चाहते हैं कि बटन पर क्लिक करने पर कोई भी कार्रवाई हो, तो आपको java.awt.event.ActionListener की आवश्यकता होगी जो "प्रतीक्षा करें" क्लिक करें, फिर java.awt.event.ActionEvent का उत्पादन करें।

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