2012-05-04 8 views
17

संभव डुप्लिकेट:
Why filename in java should be same as class name?जावा फ़ाइल का सार्वजनिक वर्ग के समान नाम क्यों होना चाहिए?

मैं एक फ़ाइल का नाम है temp.java। मैंने निम्नलिखित कोड लिखा था। यह क्यों काम करता है?

class demo //not public keyword and not same as filename 
{ 
    public static void main(String []args) 
    { 
     System.out.println("this is Main method"); 
    } 
} 

कोई भी यह क्यों काम नहीं करता है?

public class demo 
{ 
    public static void main(String []args) 
    { 
     System.out.println("this is Main method"); 
    } 
} 
+9

क्योंकि यह * कानून * है! –

+0

कृपया निम्न लिंक देखें http://wiki.answers.com/Q/Why_do_file_name_and_class_name_always_coincide_in_Java –

+1

यह प्रश्न डुप्लिकेट के रूप में डुप्लिकेट के रूप में कैसे चिह्नित किया जाता है? क्या यह कुछ विरासत 2012 जादू है? – Zsw

उत्तर

21

अपने पहले उदाहरण में, अपने वर्ग वास्तव में के रूप में (कोई संशोधक) "निजी पैकेज" है, जो एक ही पैकेज में केवल कक्षाओं यह उपयोग कर सकती हैं घोषित किया जाता है। आपके दूसरे उदाहरण में, आपने इसे सार्वजनिक के रूप में घोषित कर दिया है।

यह एक परिदृश्य है जहां संकलक जेएलएस से काफी अच्छी तरह से मुलाकात की है।

The JLS states:

जब संकुल एक फाइल सिस्टम में जमा हो जाती है (§7.2.1), मेजबान सिस्टम प्रतिबंध यह एक संकलन समय त्रुटि यह है कि अगर एक प्रकार में नहीं पाया जाता लागू करने के लिए चुन सकते हैं प्रकार का नाम प्लस एक विस्तार से बना एक नाम के तहत एक फ़ाइल (जैसे कि जावा के रूप में या .jav) यदि निम्न में से कोई भी सत्य है:

  • प्रकार पैकेज के अन्य संकलन इकाइयों में कोड से जाना जाता है जिसमें प्रकार घोषित किया गया है।
  • इस प्रकार को सार्वजनिक घोषित किया गया है (और इसलिए अन्य पैकेजों में कोड से संभावित रूप से सुलभ है)।

यह प्रतिबंध का तात्पर्य है कि प्रति संकलन इकाई में इस तरह के एक प्रकार का होना चाहिए। यह प्रतिबंध जावा प्रोग्रामिंग भाषा के लिए एक कंपाइलर या जावा वर्चुअल मशीन के कार्यान्वयन के लिए एक पैकेज के भीतर एक नामित वर्ग खोजने के लिए आसान बनाता है; उदाहरण के लिए, सार्वजनिक प्रकार wet.sprocket.Toad के लिए स्रोत कोड निर्देशिका गीले/स्पॉकेट में फ़ाइल Toad.java में मिलेगा, और संबंधित ऑब्जेक्ट कोड उसी निर्देशिका में फ़ाइल Toad.class में मिलेगा।

इसका मतलब क्या है कि क्योंकि आप केवल पैकेज निजी वर्ग demo साथ temp.java है, यह करने के लिए कोड से पैकेज के किसी भी अन्य संकलन इकाइयों में नहीं भेजा जा रहा है परिदृश्य 1 के लिए, है, इसलिए वह इस मुद्दे के बिना संकलित कर देगा ।

आपके दूसरे परिदृश्य ने कक्षा को सार्वजनिक घोषित कर दिया है - जिसका अर्थ है कि यह अन्य पैकेजों में कोड से संभावित रूप से सुलभ है - इसलिए इसे मानकों के अनुरूप होना चाहिए कि वर्ग का नाम फ़ाइल नाम के बराबर है।

यदि आपने अपने पहले परिदृश्य (उसी पैकेज में) में एक और कक्षा बनाई है और फिर demo कक्षा को संदर्भित करने का प्रयास किया है, तो आपको संकलन त्रुटि मिलनी चाहिए।

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