2013-06-03 18 views
5

का उपयोग कर वर्गों अगर मैं कहता हूँ:आयात करने के लिए वाइल्डकार्ड

import java.awt.event.ActionListener; 

मैं ActionListener कक्षा मिलता है। अगर मैं कहता हूँ:

import java.awt.event.*; 

मैं ActionListener सहित घटना वर्ग मिल सकता है? या बेहतर अभी तक:

import java.awt.*; 

मैंने सोचा कि यदि आप एक वर्ग है, पिछले दो उदाहरण की तरह, शामिल है कि आप प्रभावी रूप से उस वर्ग आयातित और उसके उपवर्गों के सभी विरासत में मिला। लेकिन, जब मैं केवल अंतिम पंक्ति का उपयोग करता हूं, उदाहरण के लिए, ग्रहण अक्सर त्रुटियों को दिखाता है कि यह कुछ वस्तुओं को हल नहीं कर सकता है और सुझाव देता है कि इसमें दोनों java.awt और java.awt.event शामिल हैं।

+4

'आयात java.awt। *' का उपयोग करके 'java.awt' पैकेज (यदि कोई हो) में केवल कक्षाएं आयात करेंगी। ध्यान दें कि '*' वाइल्डकार्ड प्रति पैकेज रिकर्सिव नहीं है। –

+2

आपका अंतिम दो नमूना 'कक्षाएं शामिल नहीं' करता है, वे * आयात पैकेज। * – EJP

उत्तर

5

जावा में "वाइल्डकार्ड" आयात केवल तत्काल स्तर पर काम करता है जिस पर कक्षाएं लागू की जाती हैं।

यही है, अगर आप कक्षाओं A, B और C है पूरी तरह से योग्य नाम के साथ,:

  • com.foo.bar.A;
  • com.foo.bar.B;
  • com.foo.C;

तो com.foo.bar.* आयात करने A और B आगे की हलचल के बिना करने के लिए उपयोग की अनुमति देगा; लेकिन C उपलब्ध नहीं होगा।

उसी तरह से, आयात करने com.foo.* आसानी से C उपलब्ध है, लेकिन नहीं A और B होगा।

अब

:

मैंने सोचा कि यदि आप एक वर्ग है, पिछले दो उदाहरण की तरह, शामिल है कि आप प्रभावी रूप से उस वर्ग आयातित और उसके उपवर्गों के सभी विरासत में मिला।

ऐसा नहीं है। भले ही B "विरासत" A, यदि आप पूरी तरह से योग्य आयात com.foo.bar.A का उपयोग करना चुनते हैं, तो यह स्वचालित रूप से com.foo.bar.B आयात नहीं करेगा। आपको B अलग से आयात करना होगा। जो समझ में आता है: एक इंटरफ़ेस या अमूर्त वर्ग के कार्यान्वयन को किसी भी पैकेज में एक ही पैकेज में होने के लिए मजबूर नहीं करता है; और उसी प्रोजेक्ट में, आपके पास B नामक दो वर्ग हो सकते हैं, विभिन्न पैकेजों में: कंपाइलर को क्या करना चाहिए?

कोडिंग शैली सम्मेलनों के अनुसार, जो आप या तो अपने लिए बनाते हैं या अपने काम के माहौल में पालन करना चाहते हैं, ऐसे वाइल्डकार्ड आयात पूरी तरह से और आसानी से प्रतिबंधित हो सकते हैं, और आपको A और B अलग से आयात करना होगा। स्थिर आयात के रूप में, उन्हें अन्य समस्याएं हैं ...

अंत में, ध्यान दें कि डिफ़ॉल्ट रूप से, आप आयात की घोषणा किए बिना java.lang.* का उपयोग कर सकते हैं।

+0

मैं देखता हूं। धन्यवाद। वैसे भी इस अर्थ में आयात करने के लिए मैं वर्णन कर रहा था? – sherrellbc

+1

ठीक है, मैं देखता हूँ। यदि, यहां, बी ए बढ़ाता है, तो 'com.foo.bar.A आयात करें'; आपको बी तक पहुंच नहीं देगा। आपको अलग से बी आयात करना होगा। जो समझ में आता है: किसी भी इंटरफ़ेस या अमूर्त वर्ग के कार्यान्वयन को उनके आधार इंटरफ़ेस/बेस क्लास (सौभाग्य से!) के रूप में एक ही पैकेज में लागू करने के लिए मजबूर नहीं करता है (तदनुसार संपादित उत्तर) – fge

3

java.awt.*java.awt.event.* के साथ अलग, पहले एक, java.awt पैकेज में सभी वर्गों के आयात करेगा, जबकि दूसरा एक java.awt.event भीतर सभी वर्गों आयात करेगा, आयात समारोह केवल आयात कक्षाएं होगा, संकुल नहीं है।

3

जावा ट्यूटोरियल से: Apparent Hierarchies of Packages

सबसे पहले, संकुल श्रेणीबद्ध दिखाई देते हैं, लेकिन वे नहीं कर रहे हैं। उदाहरण के लिए, जावा एपीआई में java.awt पैकेज, java.awt.color पैकेज, java.awt.font पैकेज, और कई अन्य जो जावा.एट से शुरू होते हैं। हालांकि, java.awt.color पैकेज, java.awt.font पैकेज, और अन्य java.awt.xxxx पैकेज java.awt पैकेज में शामिल नहीं हैं। उपसर्ग java.awt (जावा सार विंडो टूलकिट) संबंधों को स्पष्ट करने के लिए कई संबंधित संकुलों के लिए प्रयोग किया जाता है, लेकिन शामिल नहीं दिखाना।

java.awt.* आयात कर रहा है java.awt पैकेज में प्रकार के सभी आयात करता है, लेकिन यह java.awt.color, java.awt.font, या किसी अन्य java.awt.xxxx संकुल आयात नहीं करता। आप java.awt में उन लोगों के साथ ही java.awt.color में वर्गों और अन्य प्रकार के उपयोग करने की योजना है, तो आप अपने सभी फाइलों के साथ दोनों संकुल आयात करना होगा:

import java.awt.*;

import java.awt.color.*;

3

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

जावा में पैकेज नाम संरचना निर्देशिका संरचना से मेल खाती है। तो तुम एक नामी निर्देशिका जावा के रूप में यह सोच सकते हैं और है कि निर्देशिका में जब आप कहते हैं कि

import java.awt.*; 

आप मूल रूप से कह रहे हैं कि आप उपयोग करना चाहते ऐसे AWT और कब आदि

के रूप में कई अन्य निर्देशिकाओं देखते हैं जावा नाम की निर्देशिका के अंदर निर्देशिका में सभी वर्गों के लिए संक्षिप्त नाम। तो अगर आप इस तरह अपने कोड में एक वर्ग के नाम का उपयोग करें:

List mylist; 

फिर संकलक वर्तमान पैकेज में एक वर्ग के नाम पर रखा गया सूची या java.awt.List नाम के एक वर्ग या तो लगता है का प्रयास करेंगे।

तो अगर आप घटना कहा जाता AWT निर्देशिका के अंदर एक निर्देशिका है और आप एक वर्ग है कि निर्देशिका में ActionEvent नामित है, पूरी तरह से योग्य नाम है:

java.awt.event.ActionEvent 

और आयात बयान से ऊपर मदद नहीं करता है।इसलिए एक और इंपोर्ट स्टेटमेंट

import java.awt.event.*; 

की आवश्यकता होगी, अब, अगर आप वर्ग ActionEvent संकलक मौजूदा निर्देशिका में ActionEvent, या java.awt.ActionEvent या java.awt.event.ActionEvent नाम के एक वर्ग के लिए लग रहा है का उपयोग करने के लिए कारण जब तक यह एक पाता है।

+0

+1 अच्छा जवाब। –

2

सूर्य के दस्तावेज़ से Using Package Members पर:

सबसे पहले, संकुल श्रेणीबद्ध दिखाई देते हैं, लेकिन वे नहीं कर रहे हैं। उदाहरण के लिए, जावा एपीआई में java.awt पैकेज, java.awt.color पैकेज, java.awt.font पैकेज, और कई अन्य जो java.awt से शुरू होते हैं। हालांकि, java.awt.color पैकेज, java.awt.font पैकेज, और अन्य java.awt.xxxx संकुल java.awt पैकेज में शामिल नहीं हैं। उपसर्ग java.awt (जावा सार विंडो टूलकिट) का उपयोग संबंध बनाने के लिए संबंधित संकुलों की संख्या के लिए किया जाता है, लेकिन शामिल करने के लिए नहीं दिखाता है।

आयात कर रहा है java.awt। * Java.awt पैकेज में प्रकार के सभी आयात करता है, लेकिन यह java.awt.color, java.awt.font, या किसी अन्य java.awt.xxxx संकुल आयात नहीं करता है । आपके पास समय हो तो

import java.awt.*; 
import java.awt.color.*; 

: आप वर्गों और अन्य प्रकार के java.awt.color में रूप में अच्छी तरह java.awt में उन लोगों के रूप में उपयोग करने की योजना है, तो आप अपने सभी फाइलों के साथ दोनों संकुल आयात करना होगा , आपको शायद सूर्य से the entire Packages trail के माध्यम से पढ़ने के लिए अच्छा लगेगा जो मूल बातें और अधिक जटिल अवधारणाओं पर पूरी तरह से चला जाता है। आपके प्रश्न की भाषा से, जहां आप दूसरे वर्ग विवरणों को संदर्भित करते हैं, जैसे कि विशेष कक्षाएं, ऐसा लगता है कि आप समझ में नहीं आ रहे हैं कि आप वास्तव में संकुल का जिक्र कर रहे हैं।

+0

कक्षाओं के पैकेज? मैंने अपना शब्दजाल मिश्रित किया था। कुछ दिन पहले सी से ऊपर जावा शुरू किया। – sherrellbc

+0

"मुझे एक्शनलिस्टर समेत इवेंट क्लास मिलता है? या बेहतर अभी तक:" "मैंने सोचा था कि यदि आपने पिछले दो उदाहरणों की तरह एक वर्ग शामिल किया है, तो आपने प्रभावी ढंग से उस वर्ग को आयात किया है और इसके सभी उप-वर्गों को विरासत में मिला है।" यदि आपके पास अपना शब्दजाल मिश्रित हुआ है, तो यह ठीक है, लेकिन उन वाक्यों ने वास्तव में ऐसा प्रतीत किया है कि आप कक्षाओं के रूप में संकुल में शुरुआत कर रहे थे। – ojintoad

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