2012-03-05 8 views
241

मैं निम्नलिखित कोड है:जावा - प्रकार फू का कोई enclosing उदाहरण पहुँचा जा सकता है

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. मैं कैसे जावा में एक काम कर कार्यक्रम का निर्माण करने के लिए कुछ बुनियादी गलतफहमी होती है।

कोई विचार?

+0

[जावा आंतरिक वर्ग और स्थैतिक घोंसला वर्ग] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class) – Strelok

उत्तर

392

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

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

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

+0

क्या इसका यह भी अर्थ है कि अगर मैं 'बाहरी वर्ग' को तुरंत चालू करता हूं, तो 'गैर स्थैतिक आंतरिक वर्ग' भी बनाया जाएगा, भले ही मैं इसे कहीं भी उपयोग न करें? – mr5

+0

नहीं। किसी भीतरी कक्षा के प्रत्येक ऑब्जेक्ट में माता-पिता होना चाहिए, लेकिन माता-पिता के पास 0 – jacobm

8

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

static class Thing 
70

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

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

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

  • एक स्थिर नेस्टेड कक्षा होने के लिए चीज बदलें।

    static class 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 
    } 
    
  • हैलो क्लास से बाहर निकलें।

नेस्टेड/इनर क्लासों के बारे में अधिक जानकारी के लिए: Nested Classes (The Java Tutorials)

+0

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

+0

अगर किसी को अभी भी त्रुटियां मिल रही हैं, तो सिंटैक्स 'थिंग चीज 1 << हैलोइंस्टेंटिएशन >> नई चीज() 'कुंजी है। मैंने सिंटैक्स 'थिंग चीज 1 नया << हैलो इंस्टेंटिएशन >>। थिंग() 'का उपयोग करके उलझन में कुछ मिनट बिताए। = पी –

+1

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

9

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

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"); 

     } 
    } 
} 
19

अच्छा ... बहुत अच्छे जवाब हैं लेकिन मैं इसे और अधिक जोड़ना चाहता हूं।

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

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

  3. आंतरिक कक्षा में का उपयोग आवृत्ति चर और इसके युक्त वर्ग के तरीकों तक पहुंच है।

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

  1. स्थानीय भीतरी
  2. स्टेटिक इनर के प्रकार कक्षा
  3. बेनामी इनर कक्षा

महत्वपूर्ण बिंदुओं में से कुछ के लिए ख ई याद रखें

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

चलो ऊपर अवधारणाओं practically_

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!"); 
    } 
} 

} 

मुझे आशा है कि इस वसीयत हर किसी के लिए मदद करता है देखने के लिए प्रयास करें। कृपया refer for more

+0

यह एक बहुत उपयोगी है। धन्यवाद –

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