2009-06-09 10 views
93

जावा फ़ाइल में एक से अधिक कक्षा रखने का उद्देश्य क्या है? मैं जावा के लिए नया हूँ।क्या जावा फ़ाइल में एक से अधिक कक्षाएं हो सकती हैं?

संपादित: जिसे सार्वजनिक कक्षा के अंदर एक आंतरिक कक्षा बनाकर हासिल किया जा सकता है, है ना?

उत्तर

112

हाँ, यह कर सकता है। हालांकि, केवल सार्वजनिक शीर्ष-स्तर कक्षा प्रति .java फ़ाइल हो सकती है, और सार्वजनिक शीर्ष-स्तरीय कक्षाओं में स्रोत फ़ाइल के समान नाम होना चाहिए।

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

+1

मुझे लगता है कि ऐसा करना एक अच्छा विचार है यदि आप उस अतिरिक्त कक्षाओं को निजी रखना चाहते हैं, तो उन्हें उन कक्षाओं का गलती से उपयोग करने के बाहर कुछ भी तोड़ने के बाद पूरी तरह से बदला जा सकता है। –

+3

यह 1.0 संगतता (नेस्टेड कक्षाओं से पहले) के लिए है। यह भाषा में एक बड़ी गलती है। इसका उपयोग करने का सबसे बड़ा फायदा यह है कि आईडीई में निराशाजनक फ़ाइल हैंडलिंग है। –

+23

एक सार्वजनिक, * प्रति-स्तर * प्रति फ़ाइल प्रति वर्ग। जितनी चाहें उतनी सार्वजनिक आंतरिक कक्षाएं प्रति फ़ाइल हो सकती हैं। – erickson

1

भिन्न होता है ... ऐसा एक उदाहरण anonymous classes होगा (ईवेंट ईवेंट श्रोताओं और इस तरह का उपयोग करते समय आप उन सभी का सामना करेंगे)।

2

हां यह कर सकता है, लेकिन किसी भी पैकेज के अंदर केवल 1 सार्वजनिक वर्ग हो सकता है क्योंकि जावा कंपाइलर बनाता है। क्लास फ़ाइल जो सार्वजनिक वर्ग नाम के समान नाम है, इसलिए यदि उनके 1 से अधिक सार्वजनिक वर्ग हैं तो यह होगा कंपाइलर के लिए चयन करना मुश्किल है कि क्लास फ़ाइल का नाम क्या होना चाहिए।

15

यदि आप एक सार्वजनिक कक्षा को कार्यान्वित करना चाहते हैं, तो आपको इसे उस वर्ग के नाम से फ़ाइल में लागू करना होगा। एक फ़ाइल में एक सार्वजनिक और वैकल्पिक रूप से कुछ निजी कक्षाएं हो सकती हैं। यह उपयोगी है अगर वर्गों का उपयोग केवल सार्वजनिक वर्ग द्वारा आंतरिक रूप से किया जाता है। इसके अतिरिक्त सार्वजनिक वर्ग में भीतरी कक्षाएं हो सकती हैं।

हालांकि एक स्रोत फ़ाइल में एक या एक से अधिक निजी कक्षाएं ठीक हैं, लेकिन मैं कहूंगा कि इसके बजाय आंतरिक और अज्ञात कक्षाओं का उपयोग करने के लिए और अधिक पठनीय है। उदाहरण के लिए एक एक सार्वजनिक वर्ग के भीतर एक तुलनाकारी वर्ग को परिभाषित करने के लिए एक अनाम वर्ग का उपयोग कर सकते हैं:

public static Comparator MyComparator = new Comparator() { 
    public int compare(Object obj, Object anotherObj) { 

    } 
    }; 

तुलनाकारी वर्ग सामान्य रूप से सार्वजनिक होने के लिए एक अलग फाइल की आवश्यकता होगी। इस तरह इसे कक्षा के साथ बंडल किया जाता है जो इसका उपयोग करता है।

+1

यह वास्तव में एक * निजी * वर्ग नहीं है यदि यह फ़ाइल में कोई संशोधक नहीं है। आपके पास एक * निजी * कक्षा नहीं हो सकती है, चाहे वह आंतरिक कक्षा हो क्योंकि यदि आपने किया, तो इसका उपयोग कौन कर सकता है? –

4

सामान्य रूप से, प्रति फ़ाइल एक वर्ग होना चाहिए। यदि आप चीजों को इस तरह व्यवस्थित करते हैं, तो जब आप कक्षा की खोज करते हैं, तो आप जानते हैं कि आपको केवल उस नाम के साथ फ़ाइल की खोज करने की आवश्यकता है।

अपवाद तब होता है जब एक वर्ग को एक या अधिक छोटे सहायक वर्गों का उपयोग करके सर्वोत्तम रूप से कार्यान्वित किया जाता है। आम तौर पर, जब कोड एक ही फाइल में मौजूद होते हैं तो कोड का पालन करना सबसे आसान होता है। उदाहरण के लिए, आपको विधि कॉल के बीच कुछ डेटा पास करने के लिए एक छोटी 'tuple' wrapper class की आवश्यकता हो सकती है। एक और उदाहरण 'कार्य' वर्ग रननेबल या कॉल करने योग्य लागू कर रहे हैं। वे इतने छोटे हो सकते हैं कि वे माता-पिता वर्ग बनाने और उन्हें बुलाए जाने के साथ सबसे अच्छे हैं।

4

गुमनाम आंतरिक कक्षाओं के अलावा, दूसरा उपयोग निजी आंतरिक कक्षाएं है जो सार्वजनिक इंटरफेस को लागू करती है (see this article)। बाहरी वर्ग सभी निजी क्षेत्रों और आंतरिक कक्षा के तरीकों तक पहुंच सकता है।

इससे आप दोनों के कार्यान्वयन को उजागर किए बिना मॉडल और उसके दृश्य जैसे दो कसकर-युग्मित वर्ग बना सकते हैं। एक और उदाहरण एक संग्रह और इसके iterators है।

9

हां, जितना चाहें उतना!

लेकिन, प्रत्येक फ़ाइल में केवल एक "सार्वजनिक" वर्ग।

2

मुझे लगता है कि यह होना चाहिए "केवल एक गैर-स्टेटिक शीर्ष स्तर की सार्वजनिक कक्षा प्रति .java फ़ाइल हो सकती है"। है ना?

+0

आपको इसे यहां जवाब देने के बजाय एक प्रश्न के रूप में पूछना चाहिए। –

4

ए .java फ़ाइल को संकलन इकाई कहा जाता है। प्रत्येक संकलन इकाई में शीर्ष-स्तरीय कक्षाओं और इंटरफेस की संख्या हो सकती है। यदि कोई सार्वजनिक शीर्ष-स्तरीय प्रकार नहीं हैं तो संकलन इकाई को कुछ भी नाम दिया जा सकता है।

//Multiple.java 
//preceding package and import statements 

class MyClass{...} 
interface Service{...} 
... 
//No public classes or interfaces 
... 

संकलन इकाई में केवल एक सार्वजनिक वर्ग/इंटरफ़ेस हो सकता है। सीयू इस सार्वजनिक शीर्ष-स्तरीय प्रकार के रूप में बिल्कुल नामित किया जाना चाहिए।

//Test.java 
//named exactly as the public class Test 
public class Test{...} 
//!public class Operations{...} 
interface Selector{...} 
... 
//Other non-public classes/interfaces 

Important points about the main method - part 1

Part 2

(वर्गों और भाग 2 में शामिल उसकी पहुंच का स्तर की संख्या के बारे में अंक)

1

आप एक सिंगलटन लागू करना चाहते हैं, कि एक वर्ग है कि एप्लिकेशन के निष्पादन के दौरान स्मृति में केवल एक उदाहरण के साथ आपके प्रोग्राम में चलता है, फिर सिंगलटन को लागू करने के तरीकों में से एक सार्वजनिक वर्ग के अंदर एक निजी स्थैतिक वर्ग घोंसला करना है। फिर आंतरिक निजी वर्ग केवल तब ही तत्काल होता है जब निजी घटना का उपयोग करने के लिए सार्वजनिक विधि को बुलाया जाता है।

इस विकी लेख चेक आउट,

https://en.wikipedia.org/wiki/Singleton_pattern

अवधारणा पर चबाने के लिए कुछ समय लगता है।

1

एक .java फ़ाइल में, केवल एक सार्वजनिक शीर्ष-स्तरीय वर्ग हो सकता है जिसका नाम फ़ाइल जैसा ही है, लेकिन कई सार्वजनिक आंतरिक कक्षाएं हो सकती हैं जिन्हें सभी को निर्यात किया जा सकता है और बाहरी वर्ग के फ़ील्ड/विधियों, उदाहरण के लिए: AlertDialog.Builder ('सार्वजनिक स्थैतिक' द्वारा संशोधित) ('सार्वजनिक' द्वारा संशोधित)

1

हाँ आप में एक से अधिक कक्षाएं हो सकती हैं। जावा फ़ाइल। लेकिन आपने उनमें से एक को सार्वजनिक बना दिया है। और .java फ़ाइल को उसी वर्ग के साथ सार्वजनिक कक्षा के नाम के रूप में सहेजें। जब आप उस .java फ़ाइल को संकलित करेंगे, तो आप .java फ़ाइल में परिभाषित प्रत्येक वर्ग के लिए अलग .class फ़ाइलों को प्राप्त करेंगे।

इसके अलावा एक .java फ़ाइल में एक से अधिक कक्षाओं को परिभाषित करने के लिए बहुत सी विधि हैं।

  1. इनर क्लासेस की अवधारणा का उपयोग करें।
  2. बेनामी वर्गों की अवधारणा का उपयोग करें।
1

हाँ! .java फ़ाइल में केवल एक सार्वजनिक वर्ग हो सकता है।

यदि आप इन दो वर्गों को सार्वजनिक होना चाहते हैं तो उन्हें दो .java फाइलों में डालना होगा: एजावा और बीजा।

+1

मुझे आपकी प्रतिक्रिया से यकीन नहीं है कि 12 अन्य उत्तरों से कुछ और जोड़ें – goto

1

हाँ आप एक .java फ़ाइल के अंदर एक से अधिक कक्षाएं प्राप्त कर सकते हैं। उनमें से ज्यादातर में सार्वजनिक हो सकता है। अन्य पैकेज-निजी हैं। वे निजी या संरक्षित नहीं हो सकते हैं। यदि कोई सार्वजनिक है, तो फ़ाइल में उस वर्ग का नाम होना चाहिए। अन्यथा उस फ़ाइल को इसके नाम के रूप में कुछ भी दिया जा सकता है।

एक फ़ाइल के अंदर कई कक्षाएं होने का मतलब है कि वे कक्षाएं एक ही पैकेज में हैं। तो उस पैकेज के अंदर मौजूद किसी भी अन्य वर्ग लेकिन उस फ़ाइल में नहीं, उन वर्गों का भी उपयोग कर सकते हैं। इसके अलावा, जब वह पैकेज आयात किया जाता है, तो वर्ग आयात करना भी उनका उपयोग कर सकता है।

अधिक विस्तृत जांच के लिए, आप here में अपने ब्लॉग पोस्ट पर जा सकते हैं।

+1

स्टैक ओवरफ़्लो में आपका स्वागत है! मैं सराहना करता हूं कि आपने उस जानकारी पर विस्तार किया जो पहले से कवर नहीं हुआ था। स्वामित्व घोषित करते समय और यहां प्रासंगिक जानकारी सहित, आपने अपने ब्लॉग पोस्ट का हवाला देने का भी अच्छा काम किया है। यदि आप भविष्य में इस साइट पर अधिक योगदान देना चुनते हैं (और मुझे आशा है कि आप ऐसा करें), यह सुनिश्चित करने के लिए [इस आलेख] (http://stackoverflow.com/help/promotion) पर विचार करना सुनिश्चित करें कि आपकी पोस्ट अच्छी तरह से जारी रहेगी अगर आप अपने ब्लॉग का हवाला देते हैं तो प्राप्त हुआ। – 4castle

3

हाँ 200%,

उदाहरण:

class A { 
void methodDeclaration() { System.out.println("!!!"); } 
} 
class B { 
public static void main(String[] args) { 
new A().methodDeclaration(); 
    } 
} 
4

हाँ आप एक से अधिक सार्वजनिक वर्ग बना सकते हैं, लेकिन यह एक नेस्टेड वर्ग हो गया है।

public class first { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
    } 

    public class demo1 
    { 

     public class demo2 
     { 

     } 
    } 
} 
0

वहाँ सिर्फ एक पब्लिक क्लास शीर्ष स्तर एक फ़ाइल में वर्ग हो सकता है। उस सार्वजनिक वर्ग का वर्ग नाम फ़ाइल का नाम होना चाहिए। इसमें कई सार्वजनिक आंतरिक कक्षाएं हो सकती हैं।

आपके पास एक ही फ़ाइल में कई कक्षाएं हो सकती हैं।

शीर्ष स्तर वर्ग:
1 सार्वजनिक वर्ग
0 निजी वर्ग
डिफ़ॉल्ट/संरक्षित वर्गों के किसी भी संख्या

इनर एक फ़ाइल में वर्ग दृश्यता के विभिन्न स्तरों के लिए सीमा इस प्रकार हैं कक्षाएं:
किसी भी दृश्यता (डिफ़ॉल्ट, निजी, संरक्षित, सार्वजनिक)

Ple के साथ आंतरिक कक्षाओं की किसी भी संख्या अगर मैं गलत हूं तो मुझे सही करें।

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

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