क्या एक जावा फ़ाइल में एक से अधिक वर्ग हो सकते हैं?


105

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

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


जवाबों:


128

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

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


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

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

25
प्रति फ़ाइल एक सार्वजनिक, शीर्ष-स्तरीय वर्ग। आपकी पसंद के अनुसार प्रति फ़ाइल कई सार्वजनिक आंतरिक कक्षाएं हो सकती हैं।
एरिकसन

@Tom, आपको कौन सा हिस्सा लगता है कि एक गलती है, आंतरिक कक्षाएं या प्रति फ़ाइल कई उच्च-स्तरीय कक्षाएं?
13

प्रति फ़ाइल @finnw कई शीर्ष-स्तरीय कक्षाएं। यह सिर्फ इतना गलत है। कहाँ है java.awt.LightweightDispatcher?
टॉम हॉल्टिन -

17

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

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

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

    }
  };

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


1
यह वास्तव में एक निजी वर्ग नहीं है अगर यह फ़ाइल में नो-संशोधक के साथ है। आपके पास एक निजी वर्ग नहीं हो सकता है क्योंकि यह एक आंतरिक वर्ग है क्योंकि अगर आपने ऐसा किया तो कौन इसका उपयोग कर सकता है?
ब्योर्न

10

हाँ, जितने चाहो!

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


6

A .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

मुख्य विधि के बारे में महत्वपूर्ण बिंदु - भाग 1

भाग 2

(भाग 2 में शामिल कक्षाओं की संख्या और उनके अभिगम स्तर के बारे में अंक)


5

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

public class first {

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

    public class demo1
    {

        public class demo2
        {

        }
    }
}

4

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

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


4

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

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


4

हाँ 200% ,

उदाहरण:

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

2

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



1

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


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

1

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

इस विकी लेख को देखें,

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

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


1

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


1

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

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

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

1

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

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


2
मुझे यकीन नहीं है कि आपकी प्रतिक्रिया में 12 अन्य जवाबों से अधिक कुछ भी जोड़ना
गोटो

1

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

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

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


1
ढेर अतिप्रवाह में आपका स्वागत है! मैं इस बात की सराहना करता हूं कि आपने यहां पहले से कवर नहीं की गई जानकारी को उजागर किया। आपने स्वामित्व की घोषणा करते हुए और यहां प्रासंगिक जानकारी सहित अपने ब्लॉग पोस्ट का हवाला देते हुए अच्छा काम किया। यदि आप भविष्य में इस साइट में और योगदान करने का विकल्प चुनते हैं (और मुझे आशा है कि आप ऐसा करते हैं), तो सुनिश्चित करें कि यदि आप अपने ब्लॉग का हवाला देते हैं तो यह सुनिश्चित करने के लिए इस लेख पर विचार करें
4

0

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

आपके पास एक ही फ़ाइल में कई कक्षाएं हो सकती हैं। किसी फ़ाइल में क्लास दृश्यता के विभिन्न स्तरों की सीमाएँ इस प्रकार हैं:

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

आंतरिक कक्षाएं:
किसी भी दृश्यता के साथ आंतरिक कक्षाओं की संख्या (डिफ़ॉल्ट, निजी, संरक्षित, सार्वजनिक)

अगर मैं गलत हूं कृपया मुझे सही।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.