2011-10-03 9 views
5

ठीक है, इसलिए जावा स्रोत फ़ाइल में कम से कम एक सार्वजनिक वर्ग होना चाहिए और फ़ाइल को "class-name.java" कहा जाना चाहिए। काफी उचित।सार्वजनिक कक्षा के बिना .java फ़ाइल का जावा संकलन

इसलिए, अगर मैं एक वर्ग है, तो संकलन हैं निम्नलिखित:

public class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

लेकिन क्या कीड़े मुझे कि अगर मैं इसके बाद के संस्करण कोड से 'जनता की पहुँच संशोधक निकालने के लिए, कोड अभी भी संकलित है। मुझे यह बिलकुल समझ में नहीं आया। यह निकाला जा रहा है, कोड लगता है: मेरी कक्षा

class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

उपरोक्त कोड में, के बाद से मैं 'जनता की पहुँच संशोधक हटा दिया, डिफ़ॉल्ट है या निजी उपयोग पैकेज, यानी यह बाहर की दुनिया से पहुँच नहीं किया जा सकता , केवल पैकेज के भीतर से।

तो मेरा सवाल यह है कि उपर्युक्त कोड कैसे संकलित करता है? इस मामले में HelloWorld.java फ़ाइल में 'सार्वजनिक' हैलोवर्ल्ड क्लास (केवल एक पैकेज-निजी हैलोवर्ल्ड.क्लास) नहीं है और इस प्रकार मेरी समझ को संकलित नहीं करना चाहिए।

मेरे सवालों का जवाब देने में अपना समय प्रशंसा करें!

संबंध है, anon

+0

* "जावा स्रोत फ़ाइल में कम से कम एक सार्वजनिक वर्ग होना चाहिए" * उह नहीं, [इसमें कुछ भी करने की आवश्यकता नहीं है।] (Http://stackoverflow.com/q/7791487/1134080) – ADTC

उत्तर

1

आप एक फ़ाइल में गैर सरकारी वर्ग जगह कर सकते हैं, और यह एक बग लेकिन सुविधा नहीं है।

आपकी समस्या पैकेजिंग के स्तर पर है, संकलित नहीं है। क्योंकि आप गैर सरकारी वर्ग के साथ इस फाइल को संकलित कर सकते हैं, लेकिन आप बाहर से यह फोन नहीं कर सकते हैं, तो यह आवेदन आधार वर्ग

इस तरह

के रूप में काम नहीं कर रहा:

// [+] single file: SomeWrapper.java 

public class SomeWrapper { 
    ArrayList<_PrivateDataType> pdt; 
} 
// [-] single file: SomeWrapper.java 

// [+] single file: _PrivateDataType.java 
class _PrivateDataType { 
    // members, functions, whatever goes here 
} 

// [-] single file: _PrivateDataType.java 
+0

धन्यवाद , लेकिन मेरा मुद्दा एक निजी डेटा प्रकार या कुछ भी नहीं जोड़ना है। मेरा सवाल यह है कि उपर्युक्त कोड संकलित और/यहां से काम करता है, मेरे पास .java फ़ाइल है, लेकिन इसके भीतर किसी भी सार्वजनिक कक्षा के बिना। इसके भीतर एकमात्र वर्ग एक पैकेज-निजी वर्ग है, न कि सार्वजनिक वर्ग। – anon1981

+0

और समस्या कहां है? आप एक ही पैकेज में एक ही कक्षा बना सकते हैं (उसी प्रभाव के साथ) और उस पैकेज-प्राइवेट क्लास का उपयोग करें। –

+0

फिर से, मेरा प्रश्न फ़ाइल के भीतर कोई नई कक्षा नहीं जोड़ना है। मैं केवल पैकेज निजी उपयोग से चिंतित हूं। – anon1981

6

एक जावा स्रोत फ़ाइल कम से कम एक सार्वजनिक वर्ग होना चाहिए और फ़ाइल को class-name.java

गलत होना चाहिए, शीर्ष स्तर की कक्षा को सार्वजनिक घोषित नहीं किया जाना चाहिए। जेएलएस राज्यों;

एक शीर्ष स्तर वर्ग या इंटरफ़ेस प्रकार सार्वजनिक घोषणा नहीं की है, तो यह केवल पैकेज जिसमें यह घोषित किया जाता है से एक्सेस किया जा सकता है।

http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285 अनुभाग 6.6.1 देखें।

+0

धन्यवाद! तो क्या आप कह रहे हैं कि जो भी मुख्य कहता है() इसे किसी प्रकार के पैकेज संदर्भ से बुलाता है? यही है, कॉलर (संभवतः जेवीएम) जो मुख्य() कहता है, मेरे हैलोवर्ल्ड क्लास के समान पैकेज में है? बस उलझन में! तो मेरे सवालों के जवाब देने के लिए समय निकालने के लिए धन्यवाद। – anon1981

+0

इसके अलावा, आप एक जावा फ़ाइल में कई गैर-सार्वजनिक कक्षाएं परिभाषित कर सकते हैं। –

+0

तो अब मेरा सवाल है: हैलोवर्ल्ड डिफ़ॉल्ट श्रेणी के भीतर एक पैकेज निजी वर्ग है, क्या मैं सही हूँ? तो यह डिफ़ॉल्ट पैकेज के भीतर से सुलभ होना चाहिए, लेकिन डिफ़ॉल्ट पैकेज से बाहर नहीं, सही? इस प्रकार आगे बढ़ना, जब मुख्य() को कॉल किया जाता है, तो इसे * डिफ़ॉल्ट पैकेज के भीतर * से कॉल किया जाना चाहिए, क्या मैं सही हूँ? या, जो भी मुख्य कहता है() हैलोवर्ल्ड क्लास के समान पैकेज में है। सही ? – anon1981

-1

जब आप कक्षा (या उसके फ़ील्ड या विधि) के एक्सेस संशोधक को निर्दिष्ट नहीं करते हैं, तो इसे "डिफ़ॉल्ट" पहुंच असाइन की जाती है। इसका मतलब यह है कि यह केवल उसी पैकेज के भीतर से सुलभ है (इस मामले में, डिफ़ॉल्ट पैकेज)।

वेबसाइट Javabeginner.com इस विषय पर एक लेख है - आपको जावा में एक्सेस मोडिफायर से परिचित होना चाहिए, या तो इस साइट से या अन्य।

1

एक मुख्य विधि किसी भी अन्य विधि की तरह है। केवल अंतर यह है कि को java कमांड के साथ कमांड लाइन से बुलाया जा सकता है। यहां तक ​​कि यदि मुख्य विधि कमांड लाइन से दिखाई नहीं दे रही है, तो कक्षा को अभी भी किसी अन्य जावा क्लास की तरह उपयोग किया जा सकता है, और आपकी मुख्य विधि उसी पैकेज में किसी अन्य श्रेणी द्वारा लागू की जा सकती है। इसलिए मुझे समझ में आता है कि यह संकलित करता है।

जावा मुख्य फ़ंक्शन किसी भी अर्थ में विशेष नहीं है। वहां एक टर्मिनल कमांड मौजूद है जो मुख्य नामक स्थिर विधियों का आह्वान करने में सक्षम है ...

+1

तो अब, हैलोवर्ल्ड क्लास में पैकेज-निजी पहुंच है। इस प्रकार, जो भी मुख्य (JVM?) कहता है उसे भी उसी पैकेज में होना चाहिए, है ना? – anon1981

+0

मैंने सीधे जावा क्लास से फोन किया तो हाँ। प्रतिबिंब के लिए नियम हालांकि थोड़ा अलग हैं। प्रतिबिंब के साथ, किसी भी गैर-निजी विधि का आह्वान किया जा सकता है। JVM आपकी मुख्य विधि का आह्वान करने के लिए प्रतिबिंब का उपयोग करता है। –

1

जो इसके बारे में सोचने के लिए कुछ भी नहीं है। मुझे लगता है कि यह व्यवहार कुछ सी/सी ++ - कंपाइलर में से एक जैसा है।

कोड "शून्य मुख्य() {/ ... /}" कोड उन संकलकों द्वारा सही ढंग से संकलित किया जाएगा, हालांकि यह मानक-अनुरूप कोड नहीं है। बस कहा, संकलक "int" के साथ "शून्य" का आदान-प्रदान करता है।

मुझे लगता है कि जावा कंपाइलर द्वारा एक समान व्यवहार लागू किया जाता है।

सादर, xong

+0

ऐसा लगता है कि मैं गलत हूं। =) – xong

1

एक गैर सार्वजनिक वर्गों के लिए मान्य उपयोगों रहे हैं। इसलिए जब आप फ़ाइल को संकलित करने का प्रयास करते हैं तो संकलक त्रुटि नहीं देता है।

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