2012-06-24 16 views
7

ठीक है, यह जावा में kiddies सवाल हो सकता है। हम एक फाइल में दो सार्वजनिक कक्षाओं को परिभाषित नहीं कर सकते हैं। लेकिन, किताब SCJP अध्ययन गाइड से उदाहरणों में से एक में, इस उदाहरण उल्लेख किया गया था:एक फ़ाइल में दो सार्वजनिक कक्षाएं जावा

public abstract class A{ 
    public abstract void show(String data); 
} 

public class B extends A{ 
    public void show(String data){ 
     System.out.println("The string data is "+data); 
    } 
    public static void main(String [] args){ 
     B b = new B(); 
     b.show("Some sample string data"); 
    } 
} 

जब मैं NetBeans में इस चिपकाया कॉपी तुरंत त्रुटि संकलन फेंक दिया गया था, कि सार्वजनिक वर्ग एक मुझे अलग फाइल में उल्लेख किया जाना चाहिए। क्या एससीजेपी स्ट्यूडी गाइड से यह उदाहरण वास्तव में गलत है? इसके अलावा कुछ नकली परीक्षणों में मुझे ऐसे पैटर्न वाले कई प्रश्न मिले लेकिन किसी भी विकल्प में संकलक त्रुटि का उल्लेख नहीं किया गया था। यहाँ

+3

क्या यह कहता है कि कक्षाएं एक ही फाइल में होनी चाहिए? – Puce

+0

सहमत हैं, उन दो वर्गों को अलग फाइलों में होना चाहिए। –

+0

आपको पुस्तक के बारे में चिंता नहीं करना चाहिए; यदि आप जानते हैं कि उस पुस्तक में क्या है, तो आप उड़ने वाले रंगों से गुज़रेंगे। – Tom

उत्तर

8

चिंतित हो रही है हाँ, 2 शीर्ष स्तर सार्वजनिक कक्षाएं एक फ़ाइल में अनुमति नहीं है

+0

तो एससीजेपी की ऐसी प्रतिष्ठित अध्ययन मार्गदर्शिका कैसे ऐसी आ रही है भूल ?? – Shades88

+3

शायद यह ** ** ** नहीं कहता है कि उन दो वर्गों को एक ही फ़ाइल में होना चाहिए। जावा नौसिखिया द्वारा गलती ... अध्ययन मार्गदर्शिका द्वारा नहीं :-) –

+0

वास्तव में मुझे पूरा यकीन है कि जेएलएस "प्रति फ़ाइल एक सार्वजनिक शीर्ष स्तर की कक्षा" की मांग नहीं करता है, लेकिन केवल इसकी अनुशंसा करता है। – Voo

0

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

यदि आपको कंटेनर कक्षा के किसी भी संदर्भ की आवश्यकता नहीं है, तो उनके लिए "स्थैतिक" जोड़ने की भी सिफारिश की जाती है।

-1

आप कल्पना कीजिए सकता है जगह एक फ़ाइल में दो सार्वजनिक कक्षाएं, तो संकलक के काम के बारे में सोचना: यह है कि ठीक एक वर्ग का प्रतिनिधित्व करता है अपने जावा फाइल से एक .class फ़ाइल (अन्यथा .class न खत्म होने वाली निर्माण करने के लिए है कोई मतलब नहीं होगा)।

जिस तरह से जावा कंपाइलर काम करता है, वह आपकी फ़ाइल के नाम के साथ एक .class फ़ाइल बनायेगा और आपकी दी गई फ़ाइल में फ़ाइल के नाम के साथ कक्षा की खोज करेगा - इसलिए यह आपकी फ़ाइल नाम पर निर्भर करता है सही ढंग से संकलित किया जाएगा और जो नहीं होगा।

लंबी कहानी लघु: नहीं, आप दो सार्वजनिक कक्षाओं को एक फ़ाइल में नहीं डाल सकते हैं क्योंकि संकलक सही तरीके से इसे संभालने में सक्षम नहीं होगा।

(संपादित करें:। निश्चित रूप से यह एक पब्लिक क्लास आपकी फ़ाइल के रूप में एक ही नाम है कि अंदर नए वर्गों परिभाषित करना संभव है)

+2

जेएवीएसी स्रोत फ़ाइल के नाम (.java) के आधार पर .class फ़ाइलों को उत्पन्न नहीं करता है। उदा। यदि 'abc.java' में' वर्ग डीईएफ' है और संकलित किया गया है, तो यह 'DEF.class' फ़ाइल उत्पन्न करेगा। –

+0

सी # एक फ़ाइल में कई सार्वजनिक कक्षाओं को ठीक ठीक करने की अनुमति देता है। मुझे एहसास है कि जावा की संकलन प्रक्रिया इस के लिए डिज़ाइन नहीं की गई थी, इसलिए इसे कार्यान्वित करने के लिए भाषा-विशिष्ट कारण नहीं हैं। इच्छा है कि वे इसे सी # सिस्टम की तरह काम करने के लिए बदल देंगे, हालांकि; यह अत्यधिक दुखी कर रहा है। – Venryx

+0

यहां तक ​​कि स्कैला-अन्य जेवीएम भाषा - एक फ़ाइल में एकाधिक शीर्ष स्तर/सार्वजनिक कक्षाओं को संभालती है। – javadba

2

ठीक है, अगर एक बहुत picky किया जा रहा है: आप परिभाषित कई वर्गों हो सकता है एक ही फाइल में एक सार्वजनिक संशोधक के साथ, वह स्थिर घोंसला (आंतरिक) वर्ग का उपयोग कर रहा है। इस तरह:

फ़ाइल -> Test.java

public class Test { 

    public static class SomeNestedClass { 

    } 

} 
1

हाँ, आप एक ही फाइल में दो वर्गों हो सकता है। आप उन्हें नीचे दिए गए वर्ग नाम से सार्वजनिक एक्सेस संशोधक को हटाकर,

abstract class A{ 
    public abstract void show(String data); 
} 

class B extends A{ 
    public void show(String data){ 
     System.out.println("The string data is "+data); 
    } 
    public static void main(String [] args){ 
     B b = new B(); 
     b.show("Some sample string data"); 
    } 
} 
संबंधित मुद्दे