एक संलग्न वर्ग जावा नहीं है


366

मैं एक टेट्रिस गेम बनाने की कोशिश कर रहा हूं और मुझे कंपाइलर एरर मिल रहा है

Shape is not an enclosing class

जब मैं एक वस्तु बनाने की कोशिश करता हूं

public class Test {
    public static void main(String[] args) {
        Shape s = new Shapes.ZShape();
    }
}

मैं प्रत्येक आकार के लिए आंतरिक कक्षाओं का उपयोग कर रहा हूं। यहाँ मेरे कोड का हिस्सा है

public class Shapes {
    class AShape {
    }
    class ZShape {
    }
}

मैं क्या गलत कर रहा हूं ?


160
new Shape().new ZShape();। वर्ग ZShapeको त्वरित करने के लिए एक संलग्न उदाहरण की आवश्यकता है।
सोतीरियोस डेलिमोलिस

4
फ़ाइल को अलग करने के लिए आंतरिक कक्षा को स्थानांतरित करें
4:00 बजे दिमुधु

@ दिमुधु टिप्पणी का इस मामले में जवाब होना चाहिए। उन्हें आंतरिक वर्ग नहीं होना चाहिए। उन्हें ले जाने से आकृति वर्ग के साथ अन्य समस्याओं की पहचान होगी।
यिर्मयाह एडम्स

यहां सवाल का जवाब देने, लेकिन मैं उपयोग करने के लिए कर सकते हैं सुझाव विरासत यहाँ जहां AShapeऔर ZShapeआधार वर्ग का विस्तार Shapes। घोंसले के शिकार वर्ग इस समस्या के लिए वास्तव में अच्छा डिज़ाइन नहीं है।
परमवीर सिंह करवाल

जवाबों:


492

ZShape स्थिर नहीं है, इसलिए उसे बाहरी वर्ग के उदाहरण की आवश्यकता होती है।

सबसे आसान उपाय staticयदि आप कर सकते हैं तो ZShape और किसी भी नेस्टेड वर्ग को बनाएं ।

मैं कोई भी क्षेत्र बनाऊंगा finalया static finalआप भी कर सकते हैं।


13
बनाने ZShape staticका उद्देश्य पूरी तरह से पराजित करता है कि वह क्या करने की कोशिश कर रहा है, जिसकी एक प्रति तुरंत है ZShape
कार्डनो

17
@ कार्डेनो staticइसे बनाना आसान बनाता है, कठिन नहीं।
पीटर लॉरी

12
एक और सरल उपाय enclosing वर्ग इन्स्तांत भीतरी वर्ग, यानी ZShape इस तरह से हो रही है बनाने के लिए है: ZShape myShape = new Shape().instantiateZShape();। इसका मतलब है कि ZShape आपको एक शेप के बिना नहीं मिलता है, जो कि यहां आशय है।
विंस

@Peter Lawrey आपको कैसे पता चला कि सभी आकृति के उदाहरणों में समान ZShape का उपयोग करना है? मुझे यह उसके स्रोत से नहीं मिला।
अविश्वसनीय जन

2
अगर हम स्थैतिक या एक उदाहरण चाहते हैं तो 2 मामले हैं। इसे स्टैटिक बनाने से हमेशा मदद नहीं मिलेगी।
योगेश चौहान

177

मान लीजिए कि RetailerProfileModel आपका मुख्य वर्ग है और RetailerPaymentModel एक आंतरिक वर्ग है। आप कक्षा के बाहर इनर क्लास की एक वस्तु इस प्रकार बना सकते हैं:

RetailerProfileModel.RetailerPaymentModel paymentModel
        = new RetailerProfileModel().new RetailerPaymentModel();

34
यह उत्तर वास्तव में मददगार था, मुझे कभी नहीं पता था कि आप एक पंक्ति में दो बार नया कॉल कर सकते हैं (और मैंने 8+ वर्ष के लिए जावा किया है!)
पॉलबगड

1
आप निश्चित रूप से किसी भी समय नए ऑपरेटर को कॉल कर सकते हैं जब तक आप उस वस्तु का संदर्भ नहीं रखना चाहते।
विशाल कुमार

1
यदि आंतरिक वर्ग की कोई वस्तु इस तरह बनाई जाती है, तो वह बाहरी वर्ग के सदस्यों तक कैसे पहुंचती है?
ज़िंगांग हुआंग

1
भीतर के वर्ग के भीतर, आप OuterClass.this का उपयोग कर सकते हैं। मुझे नहीं लगता कि आंतरिक कक्षा के कोड के बाहर से उदाहरण प्राप्त करने का कोई तरीका है। बेशक, आप हमेशा अपनी खुद की संपत्ति का परिचय कर सकते हैं: सार्वजनिक आउटरक्लास गेटऑउट () {रिटर्न OuterClass.this; }
विशाल कुमार

परीक्षणों के लिए काम करता है:underTest = Mockito.mock(Outer.class).new InnerNonStaticClass();
felvhage

48

मैं जो सुझाव देता हूं वह गैर-स्थिर वर्ग को एक स्थिर वर्ग में परिवर्तित नहीं कर रहा है क्योंकि उस स्थिति में, आपका आंतरिक वर्ग बाहरी वर्ग के गैर-स्थिर सदस्यों तक नहीं पहुंच सकता है।

उदाहरण :

class Outer
{
    class Inner
    {
        //...
    }
}

तो, ऐसे मामले में, आप कुछ ऐसा कर सकते हैं:

Outer o = new Outer();
Outer.Inner obj = o.new Inner();

Outer.Inner obj = (new Outer) .new Inner () के बारे में क्या;
हुसैन केएमआर बेहेस्टी

1
@HussainKMRBehestee, निश्चित रूप से काम नहीं करेगा। हालाँकि, यह काम करेगाOuter.Inner obj = new Outer().new Inner();
अमित उपाध्याय

लेकिन अमित, यह मेरे लिए काम करता है। मुझे खुशी होगी अगर आप बता सकते हैं कि यह काम क्यों नहीं करना चाहिए।
हुसैन केएमआर बेहेस्टी

1
@HussainKMRBehestee, स्पष्टीकरण: मैं केवल अनुमान लगा सकता हूं कि जावा में व्याकरण कहता है कि एक वर्ग को तुरंत बनाने के लिए हमें निर्माणकर्ता को कॉल करने की आवश्यकता है, और निर्माणकर्ता को कॉल करना ()अनिवार्य है। हालाँकि, C, C ++ यह आवश्यक नहीं है। यहाँ एक उदाहरण है जो काम नहीं करता है। इसके अलावा, मुझे यह पोस्ट मिली । जो जावा में व्याकरण के बारे में अधिक बता रहा है और उन्हें कैसे पार्स किया जाता है। मैं एक नमूना मामला देखना पसंद करूंगा जब यह वाक्य रचना आपके लिए काम कर रही हो।
अमित उपाध्याय

1
ओह, मेरा बुरा, यह एक टाइपो था, आउटर। इनर obj = (नया आउटर ())। नया इनर (); उम्मीद है कि इस बार यह ठीक है और इस पर ध्यान देने के लिए धन्यवाद।
हुसैन केएमआर बेहिस्ते

18

डॉक्स में कहा गया है :

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - समीक्षा से
मुहम्मद ओमर असलम

धन्यवाद! बस शुरू कर रहा हूँ।
ब्रेनन मिलर

10

कभी-कभी, हमें एक आंतरिक वर्ग का एक नया उदाहरण बनाने की आवश्यकता होती है जो स्थिर नहीं हो सकता क्योंकि यह मूल वर्ग के कुछ वैश्विक चर पर निर्भर करता है। उस स्थिति में, यदि आप एक आंतरिक वर्ग का उदाहरण बनाने की कोशिश करते हैं जो स्थिर नहीं है, तो एक not an enclosing classत्रुटि है।

प्रश्न का उदाहरण लेते हुए, क्या होगा यदि ZShapeस्थिर नहीं हो सकता है क्योंकि उसे Shapeवर्ग के वैश्विक चर की आवश्यकता है ?

आप का नया उदाहरण कैसे बना सकते हैं ZShape? इस तरह से:

मूल वर्ग में एक गेट्टर जोड़ें:

public ZShape getNewZShape() {
    return new ZShape();
}

इसे इस तरह एक्सेस करें:

Shape ss = new Shape();
ZShape s = ss.getNewZShape();


1

मैंने उसी समस्या का सामना किया है। मैंने प्रत्येक आंतरिक सार्वजनिक वर्ग के लिए एक उदाहरण बनाकर हल किया। जैसा कि आप की स्थिति है, मैं सुझाव देता हूं कि आप आंतरिक कक्षाओं के अलावा विरासत का उपयोग करें।

public class Shape {

    private String shape;

    public ZShape zShpae;
    public SShape sShape;

    public Shape(){
      int[][] coords =  noShapeCoords;
      shape = "NoShape";
      zShape = new ZShape();
      sShape = new SShape();
    }

    class ZShape{
      int[][] coords =  zShapeCoords;
      String shape = "ZShape";
    }

    class SShape{
      int[][] coords = sShapeCoords;
      String shape = "SShape";
    }

 //etc
}

तो आप नए आकार () कर सकते हैं; और आकार के माध्यम से ZShape पर जाएँ। Shhape;


1
एक गलत समाधान। तार्किक त्रुटि। यदि आंतरिक वर्ग (जैसे ZShape) को किसी भी क्षेत्र को सेट करने की आवश्यकता है, तो बाहरी वर्ग के निर्माता में आपको इसे प्राप्त करना होगा! सार्वजनिक आकार (स्ट्रिंग field1_innerClass, int field2_innerClass ...) {zShape = new ZShape (स्ट्रिंग फ़ील्ड 1_innerClass, int field2_innerClass ...) ...}}
मोहसिन अबसी

1

नेस्टेड क्लास को स्थिर बनाने की आवश्यकता नहीं है, लेकिन यह सार्वजनिक होना चाहिए

public class Test {
    public static void main(String[] args) {
        Shape shape = new Shape();
        Shape s = shape.new Shape.ZShape();
    }
}

1

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

इस प्रकार, त्रुटि मिलने पर

xxx एक संलग्न वर्ग नहीं है

आप इसे निम्नलिखित में से किसी एक तरीके से हल कर सकते हैं:

  • staticकीवर्ड को आंतरिक वर्ग में जोड़ें , या
  • इसे अपनी अलग कक्षा में ले जाएं।

1

यदि पैरेंट क्लास सिंगलटन का निम्न तरीके से उपयोग करती है तो:

Parent.Child childObject = (Parent.getInstance()).new Child();

getInstance()पैरेंट क्लास सिंगलटन ऑब्जेक्ट को कहां लौटाएगा।


0

प्रश्न से आवश्यकता को प्राप्त करने के लिए, हम कक्षाओं को इंटरफ़ेस में रख सकते हैं:

public interface Shapes {
    class AShape{
    }
    class ZShape{
    }
}

और फिर लेखक के रूप में उपयोग करने से पहले की कोशिश की:

public class Test {
    public static void main(String[] args) {
        Shape s = new Shapes.ZShape();
    }
}

यदि हम उचित "तार्किक" समाधान की तलाश में हैं, तो fabricडिजाइन पैटर्न का उपयोग किया जाना चाहिए

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