2013-07-17 5 views
7

हम फ़ाइल java कमांड के बाद filename के बजाय क्यों नहीं देते हैं?हम "जावा" कमांड के साथ .class एक्सटेंशन का उपयोग क्यों नहीं करते हैं?

मान लीजिए कि हम test.java प्रोग्राम को संकलित करना चाहते हैं, तो हम javac test.java चलाते हैं। यह ठीक है!

इसके बाद यह test.class फ़ाइल का उत्पादन करेगा, लेकिन प्रोग्राम चलाने के लिए हम के बजाय java test चलाते हैं। इसका कारण क्या है?

+2

अंत में, क्योंकि है कि जिस तरह से यह बनाया गया है है। इसे अलग-अलग डिजाइन किया जा सकता था, लेकिन, जैसा कि नीचे दिए गए उत्तरों का सुझाव है, ".class" पर ध्यान देना पैकेज नाम पार्सिंग को भ्रमित कर देगा और इसमें कोई संदेह नहीं है कि कई अन्य चीजें हैं। ऐसी चीजों के लिए कभी भी "तार्किक" डिज़ाइन नहीं होता है, केवल कुछ डिज़ाइन जो दूसरों की तुलना में कम अजीब हैं। –

उत्तर

20

क्योंकि आप चलाने के लिए फ़ाइल का वर्णन नहीं कर रहे हैं। आप जावा को बता रहे हैं कि वर्ग में मुख्य विधि है - और वर्ग का नाम है (आपके मामले में) filename, filename.class नहीं।

तथ्य यह है कि बाइटकोड लगभग हमेशा फाइल सिस्टम पर फ़ाइलों में निहित है एक कार्यान्वयन विस्तार है। क्लासपाथ जिसे आप java कमांड पर पास करते हैं, उसे कक्षाओं को देखने के लिए कहां बताता है, और फिर मुख्य श्रेणी तर्क यह बताता है कि किस वर्ग का उपयोग करना है।

(क्योंकि यह कार्यक्रम विशेष रूप से स्रोत फ़ाइलों ध्यान देती है और उन्हें बाईटकोड में संकलित यह javac के लिए अलग है।)

+0

यह उल्लेख करना उपयोगी हो सकता है कि कोड क्लासपाथ पर एक जेएआर या अन्य जगहों पर हो सकता है। – bstempi

6

आप या तो जावा आदेश के लिए एक फ़ाइल नाम से पारित नहीं है। आप इसे पूरी तरह से योग्य वर्ग नाम पास करते हैं। कुछ com.yourcompany.yourapp.Main की तरह। जावा को क्लासपाथ में सभी निर्देशिकाओं और जार फ़ाइलों को देखकर, इस कक्षा के नाम के लिए .class फ़ाइल पाती है।

1

यह एक कार्यान्वयन विस्तार है। जावा क्लास लोडर सिस्टम को अलग-अलग व्यवहार करने के लिए कस्टम कोड द्वारा बढ़ाया जा सकता है। उदाहरण के लिए, कुछ कंपनियों ने एन्क्रिप्टेड क्लास लोडर लिखे हैं जो फ्लाई पर एन्क्रिप्टेड क्लास फाइलों को डिक्रिप्ट करने और लोड करने में सक्षम हैं। आप एक समान प्रणाली बना सकते हैं जो कक्षाओं के समूह को एक जार फ़ाइल के बजाय .NET असेंबली जैसा दिखता है (जो वास्तव में केवल एक ज़िप फ़ाइल है)।

0

जब आप निष्पादित "java test.class"

आप या तो

Could not find or load main class test.class

या

Exception in thread "main" java.lang.NoClassDefFoundError: test/class

इसका कारण यह है "java" "java test.class" में jvm है। यह "test" के बजाय "class" नामक कक्षा में मुख्य विधि की तलाश करता है। "java test.class" में डॉट का एक महत्वपूर्ण अर्थ है। तो jvm "java test.class" को "test" नामक पैकेज में "class" नामक एक पैकेज में दिखता है।

*test.class* 

*test* - package name 

*class* - java filename 

आशा है कि इससे मदद मिलती है !!

-1

javac संकलक Xyz.class बुलाया फ़ाइल बनाता है (यहाँ Xyz फ़ाइल नाम है) कि कार्यक्रम की बाइट संस्करण जावा बाईटकोड लेकिन आपका प्रोग्राम कि शिक्षा जावा दुभाषिया निष्पादित करेंगे शामिल के मध्यवर्ती प्रतिनिधित्व कुछ भी नहीं होता है।
इस प्रकार, javac के उत्पादन कोड है कि सीधे

संक्षेप में

क्रियान्वित किया जा सकता है, javac कीवर्ड तो संकलित जावा प्रोग्राम अगर हम javac (पहले से ही संकलित फ़ाइल .class फ़ाइल) के साथ .class का उपयोग के लिए प्रयोग किया जाता है कैसे पहले से ही संकलित कर सकते हैं फ़ाइल

तो मान्य सिंटेक्स है संकलन: javac Xyz.java (संकलित जावा प्रोग्राम) जावा Xyz (भागो जावा प्रोग्राम)

+0

यह सवाल का जवाब नहीं देता है। आप बस उस बिंदु को याद करते हैं कि 'जावा' को फ़ाइल चलाने के लिए नहीं बुलाया जाता है, लेकिन एक क्लास। और कक्षा के नामों में फ़ाइल नामों का .class एक्सटेंशन नहीं है। – GhostCat

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