जावा - Foo प्रकार का कोई संलग्न उदाहरण सुलभ नहीं है


314

मेरे पास निम्नलिखित कोड हैं:

class Hello {
    class Thing {
        public int size;

        Thing() {
            size = 0;
        }
    }

    public static void main(String[] args) {
        Thing thing1 = new Thing();
        System.out.println("Hello, World!");
    }
}

मुझे पता Thingहै कि कुछ भी नहीं है, लेकिन मेरा हैलो, वर्ल्ड प्रोग्राम इसके बिना ही ठीक है। यह केवल मेरी परिभाषित कक्षाएं हैं जो मुझ पर विफल हो रही हैं।

और यह संकलन करने से इनकार करता है। मुझे No enclosing instance of type Hello is accessible."उस लाइन पर मिलता है जो एक नई चीज बनाता है। मैं अनुमान लगा रहा हूँ:

  1. मुझे सिस्टम स्तर की समस्याएं हैं (या तो DrJava या मेरे जावा इंस्टाल में) या
  2. मुझे जावा में काम करने के कार्यक्रम का निर्माण करने की कुछ बुनियादी गलतफहमी है।

कोई विचार?


जवाबों:


483

static class Thing अपने कार्यक्रम काम करेंगे।

जैसा कि है, आपको Thingएक आंतरिक वर्ग के रूप में मिला है , जो (परिभाषा के अनुसार) एक विशेष उदाहरण के साथ जुड़ा हुआ है Hello(भले ही यह कभी भी इसका उपयोग या संदर्भित नहीं करता है), जिसका अर्थ है कि यह new Thing();एक विशेष Helloउदाहरण के बिना कहने में एक त्रुटि है । गुंजाइश।

यदि आप इसके बजाय एक स्थिर वर्ग के रूप में घोषित करते हैं, तो यह एक "नेस्टेड" वर्ग है, जिसे किसी विशेष Helloउदाहरण की आवश्यकता नहीं है ।


यह भी मतलब यह है कि अगर मैं का दृष्टांत outer class, non-static inner classके रूप में अच्छी तरह से बनाया जा जाएगा, भले ही मैं इसे कहीं भी उपयोग नहीं करते हैं?
mr5

नहीं। एक आंतरिक वर्ग की हर वस्तु एक माता पिता होना आवश्यक है, लेकिन माता-पिता सहित 0. बच्चों के किसी भी संख्या हो सकती है
jacobm

92

आपने कक्षा Thingको एक गैर-स्थिर आंतरिक वर्ग घोषित किया है । इसका मतलब है कि यह Helloकक्षा के एक उदाहरण के साथ जुड़ा होना चाहिए ।

अपने कोड में, आप Thingएक स्थिर संदर्भ से एक उदाहरण बनाने की कोशिश कर रहे हैं । यही कंपाइलर शिकायत कर रहा है।

कुछ संभावित उपाय हैं। उपयोग करने के लिए कौन सा समाधान इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं।

  • कक्षा से Thingबाहर जाएं Hello

  • नेस्टेड क्लास Thingहोने के लिए बदलें static

    static class Thing
  • का उदाहरणHello बनाने से पहले एक उदाहरण बनाएं Thing

    public static void main(String[] args)
    {
        Hello h = new Hello();
        Thing thing1 = h.new Thing(); // hope this syntax is right, typing on the fly :P
    }

अंतिम समाधान (एक गैर-स्टैटिक नेस्टेड क्लास) अनिवार्य होगा, यदि किसी उदाहरण पर Thingनिर्भर कोई उदाहरण Helloसार्थक हो। उदाहरण के लिए, यदि हमारे पास था:

public class Hello {
    public int enormous;

    public Hello(int n) {
        enormous = n;
    }

    public class Thing {
        public int size;

        public Thing(int m) {
            if (m > enormous)
                size = enormous;
            else
                size = m;
        }
    }
    ...
}

किसी भी वर्ग की वस्तु बनाने का कोई कच्चा प्रयास Thing, जैसे:

Thing t = new Thing(31);

समस्याग्रस्त होगा, क्योंकि इसके enormousखिलाफ 31 परीक्षण करने के लिए एक स्पष्ट मूल्य नहीं होगा । इस मूल्य को प्रदान करने hके लिए Helloबाहरी वर्ग का एक उदाहरण आवश्यक है h.enormous:

...
Hello h = new Hello(30);
...
Thing t = h.new Thing(31);
...

क्योंकि इसका मतलब यह नहीं है Thingअगर यह एक नहीं है Hello

नेस्टेड / आंतरिक वर्गों के बारे में अधिक जानकारी के लिए: नेस्टेड क्लासेस (जावा ट्यूटोरियल)


आपका उत्तर व्यापक और सिंथेटिक दोनों है। यहां तक ​​कि अगर यह अजीब लगता है (कम से कम मेरे लिए), वाक्यविन्यास सही है।
बुबाम

यदि किसी को अभी भी त्रुटियां हो रही हैं, तो सिंटैक्स Thing thing1 <<HelloInstantiation>>.new Thing()कुंजी है। मैंने सिंटैक्स का उपयोग करके कुछ मिनटों को भ्रमित किया Thing thing1 new <<HelloInstantiation>>.Thing()। = पी
स्किया.हिलौ

1
@ skia.heliou धन्यवाद! मैं एक सहायक वर्ग और स्थिर चर (या यहां तक ​​कि कक्षाएं) बना रहा था कि न केवल गुंजाइश खत्म हो जाए, बल्कि वे अक्सर अक्षम होते हैं। रनटाइम तर्क प्रदान करने की आवश्यकता से यह एक मुख्य विधि का उपयोग करने के लिए परेशान करता है। यह सब मुझे चाहिए था और वास्तव में जो मुझे ढूंढना था।
गाड़ी

25

अच्छा ... इतने अच्छे जवाब लेकिन मैं उस पर और अधिक जोड़ना चाहता हूं। जावा में आंतरिक कक्षा पर एक संक्षिप्त नज़र- जावा हमें एक वर्ग को दूसरी कक्षा के भीतर परिभाषित करने की अनुमति देता है और इस तरह से घोंसला वर्ग के लिए सक्षम होने में सक्षम होता है:

  1. यह अन्य वर्गों से वर्ग को छिपा सकता है (यह एन्कैप्सुलेशन बढ़ाता है) - विशेष रूप से प्रासंगिक यदि वर्ग केवल उस वर्ग द्वारा उपयोग किया जा रहा है जो इसके भीतर निहित है। इस मामले में बाहरी दुनिया को इसके बारे में जानने की कोई आवश्यकता नहीं है।

  2. यह कोड को अधिक बनाए रखने योग्य बना सकता है क्योंकि कक्षाओं को तार्किक रूप से एक साथ समूहीकृत किया जाता है जहां उनकी आवश्यकता होती है।

  3. आंतरिक वर्ग की पहुँच चर और इसके वर्ग युक्त विधियों की पहुँच है।

हमारे पास मुख्य रूप से तीन प्रकार के हैं Inner Classes

  1. स्थानीय आंतरिक
  2. स्टेटिक इनर क्लास
  3. अनाम भीतरी वर्ग

याद रखने योग्य कुछ महत्वपूर्ण बिंदु

  • हमें स्थानीय इनर क्लास तक पहुंचने के लिए क्लास ऑब्जेक्ट की आवश्यकता है जिसमें यह मौजूद है।
  • स्टेटिक इनर क्लास सीधे उसी कक्षा के किसी भी अन्य स्थिर तरीके की तरह ही एक्सेस किया जाता है जिसमें यह मौजूद है।
  • अनाम इनर क्लास बाहर की दुनिया के साथ-साथ उसी कक्षा के अन्य तरीकों या कक्षाओं (जिसमें यह मौजूद है) में दिखाई नहीं देता है और इसका उपयोग उस बिंदु पर किया जाता है जहां इसे घोषित किया जाता है।

उपरोक्त अवधारणाओं को व्यावहारिक रूप से देखने की कोशिश करते हैं

public class MyInnerClass {

public static void main(String args[]) throws InterruptedException {
    // direct access to inner class method
    new MyInnerClass.StaticInnerClass().staticInnerClassMethod();

    // static inner class reference object
    StaticInnerClass staticInnerclass = new StaticInnerClass();
    staticInnerclass.staticInnerClassMethod();

    // access local inner class
    LocalInnerClass localInnerClass = new MyInnerClass().new LocalInnerClass();
    localInnerClass.localInnerClassMethod();

    /*
     * Pay attention to the opening curly braces and the fact that there's a
     * semicolon at the very end, once the anonymous class is created:
     */
    /*
     AnonymousClass anonymousClass = new AnonymousClass() {
         // your code goes here...

     };*/
 }

// static inner class
static class StaticInnerClass {
    public void staticInnerClassMethod() {
        System.out.println("Hay... from Static Inner class!");
    }
}

// local inner class
class LocalInnerClass {
    public void localInnerClassMethod() {
        System.out.println("Hay... from local Inner class!");
    }
 }

}

मुझे उम्मीद है कि इससे सभी को मदद मिलेगी। कृपया अधिक के लिए देखें


सुझाए गए सुधार: प्रथम श्रेणी MyOuterClass को नाम दें, अनामिका के चारों ओर की टिप्पणियों को हटा दें।
नूमेनन

9

Thingएक आंतरिक वर्ग है जिसका एक स्वचालित कनेक्शन के साथ एक उदाहरण है Hello। आपको एक संकलित त्रुटि मिलती है क्योंकि इसमें Helloसंलग्न करने के लिए कोई उदाहरण नहीं है। आप इसे स्थैतिक रूप से नेस्टेड वर्ग में बदलकर आसानी से ठीक कर सकते हैं जिसका कोई संबंध नहीं है:

static class Thing

9

इसे निम्नलिखित सरल उदाहरण से समझते हैं। ऐसा इसलिए होता है क्योंकि यह NON-STATIC INNER CLASS है। आपको बाहरी वर्ग का उदाहरण चाहिए।

 public class PQ {

    public static void main(String[] args) {

        // create dog object here
        Dog dog = new PQ().new Dog();
        //OR
        PQ pq = new PQ();
        Dog dog1 = pq.new Dog();
    }

    abstract class Animal {
        abstract void checkup();
    }

    class Dog extends Animal {
        @Override
        void checkup() {
            System.out.println("Dog checkup");

        }
    }

    class Cat extends Animal {
        @Override
        void checkup() {
            System.out.println("Cat Checkup");

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