2012-04-24 12 views
12

मेरे पास एक बहुत ही सरल वर्ग है जिसे मैं किसी दूसरे के उप-वर्ग के रूप में उपयोग करना चाहता हूं। लेकिन जब मैं माता पिता की कक्षा में अपने कोड डाल मैं:मुझे "गैर स्थैतिक चर क्यों मिलता है जिसे इसे स्थिर संदर्भ से संदर्भित नहीं किया जा सकता"?

गैर स्थैतिक चर यह एक स्थिर संदर्भ

से संदर्भित नहीं किया जा सकता दूसरी ओर जब मैं GenTest के वर्ग sublass डाल "पैरेंट्स" क्लास कोड के बाहर कोड - JavaApp1 मुझे यह त्रुटि नहीं मिली है।

public class JavaApp1 { 

    class GenTest { 
     @Deprecated 
     void oldFunction() { 
      System.out.println("don't use that"); 
     } 
     void newFunction() { 
      System.out.println("That's ok."); 
     } 
    } 

    public static void main(String[] args) { 
     GenTest x = new GenTest(); 
     x.oldFunction(); 
     x.newFunction(); 
    } 
} 

ऐसा क्यों हो रहा है?

+2

यह उल्लेखनीय है कि जेनटेस्ट JavaApp1 का उप-वर्ग नहीं है। यह एक घोंसला वर्ग है। अंतर यह है कि उप-वर्गों को उनके मूल वर्ग के सार्वजनिक और संरक्षित गुणों का उत्तराधिकारी होता है। – ccoakley

+0

बस जेनटेस्ट को अपनी फाइल में रखें। JavaApp1 में इसे घोंसला करने की कोई आवश्यकता नहीं है। –

+1

http://stackoverflow.com/questions/5272957/problem-creating-object-of-inner-class-in-java –

उत्तर

16

आपका नेस्टेड वर्ग स्थिर होने के रूप में चिह्नित नहीं है, (जो नहीं एक उपवर्ग, जिस तरह से होता है) इसलिए यह एक भीतरी वर्ग जो करने के लिए एन्कोडिंग वर्ग (JavaApp1) का एक उदाहरण की आवश्यकता है इसे बनाओ

विकल्प:

  • नेस्टेड वर्ग स्थिर
  • इसे नहीं एक आंतरिक वर्ग बनाने
  • (यानी JavaApp1 बिल्कुल के भीतर नहीं) JavaApp1 "संलग्न उदाहरण" के रूप में की आवृत्ति बनाएँ:

    GenTest x = new JavaApp1().new GenTest(); 
    

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

आंतरिक कक्षाओं के बारे में अधिक जानकारी के लिए section 8.1.3 of the JLS देखें।

2

यह static class GenTest होना चाहिए, क्योंकि आप स्थिर विधि से इसका उदाहरण बनाते हैं।

इसके अलावा, सामान्य रूप से, आंतरिक कक्षाएं स्थिर होनी चाहिए।

1

कक्षा GenTest एक गैर स्थैतिक वर्ग है और इसलिएके उदाहरण के भीतर तत्काल होना चाहिए। यदि आप static class GenTest करते हैं जो आपके पास काम करता है अन्यथा आपको JavaApp1 का उदाहरण बनाने और गैर-स्थैतिक विधि के भीतर GenTest बनाने की आवश्यकता है।

1

थार क्योंकि जेनटेस्ट जावाएप 1 के संदर्भ के साथ परिभाषित किया गया है। तो आप इसका उल्लेख तब तक कर सकते हैं जब तक आपके पास JavaApp1 का उदाहरण न हो। इसे काम करने के लिए इसे static class पर बदलें।

static class GenTest...

1

कृपया का उपयोग करें

static class GenTest()...... 
0

जिस तरह से आप लागू कर रहे हैं कि ऐसा करने का सही तरीका नहीं है।के बाद से आंतरिक वर्ग GenTest आह्वान करने के लिए JavaApp1 सही तरीके का एक सदस्य है कि यह अपने वर्ग का उपयोग सही ढंग से संकलित हैं

GenTest x = new JavaApp1().new GenTest();

होगा।

0

कक्षा नेस्टेड है जिसका अर्थ है कि आपकी नेस्टेड क्लास स्थिर नहीं है, जिसका अर्थ है कि आपको मुख्य श्रेणी के ऑब्जेक्ट के माध्यम से नेस्टेड क्लास के लिए ऑब्जेक्ट बनाना है। इसका मतलब क्या है कि आपका psvm इस तरह होना चाहिए।

public static void main(String[] args) { 
    JavaApp1 a=new JavaApp1(); //create an object for the main class 
    JavaApp1.GenTest x=a.new GenTest(); 

    x.oldFunction(); 
    x.newFunction(); 
} 
संबंधित मुद्दे

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