एक अनाम वर्ग "एक्सटेंड" या "इम्प्लीमेंट्स" का उपयोग कैसे कर सकता है?


96

एक गुमनाम वर्ग एक सुपरक्लास का विस्तार कैसे कर सकता है या एक इंटरफ़ेस लागू कर सकता है?


दुर्भाग्य से, आपको कंस्ट्रक्टर को उन स्थानों पर दिखाई देना होगा जो अन्यथा नहीं होंगे।
श्रीधर सरनोबत

जवाबों:


98

बेनामी वर्गों को किसी भी अन्य जावा वर्ग की तरह कुछ का विस्तार या कार्यान्वयन करना चाहिए , भले ही वह बस हो java.lang.Object

उदाहरण के लिए:

Runnable r = new Runnable() {
   public void run() { ... }
};

यहां, rएक अनाम वर्ग की एक वस्तु है जो लागू करता है Runnable

एक अनाम वर्ग एक ही वाक्यविन्यास का उपयोग करके दूसरे वर्ग का विस्तार कर सकता है:

SomeClass x = new SomeClass() {
   ...
};

आप जो नहीं कर सकते हैं वह एक से अधिक इंटरफ़ेस लागू है। आपको ऐसा करने के लिए एक नामित वर्ग की आवश्यकता है। न तो एक अनाम आंतरिक वर्ग, न ही एक नामित वर्ग, हालांकि, एक से अधिक वर्ग का विस्तार कर सकते हैं।


1
मुझे नहीं लगता कि दूसरी अभिव्यक्ति सही है। आपने पहले ही वर्ग का नाम SomeClass घोषित कर दिया है, यह अब अनाम नहीं है। इस लिंक को देखें docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm जब आप "नया" एक इंटरफेस बनाते हैं , तो एक अनाम वर्ग "ऑब्जेक्ट" क्लास को बढ़ाकर और उस इंटरफ़ेस को लागू करके बनाया जाता है। लेकिन जब आप पहली अभिव्यक्ति के साथ एक वर्ग "नया" कर रहे हैं, तो एक अनाम वर्ग (वास्तव में, यह उस अनाम वर्ग का एक उदाहरण बनता है) उस वर्ग का विस्तार करके बनाया जाएगा।
lixiang

8
@youmiss: दूसरी अभिव्यक्ति एक अनाम वर्ग का उदाहरण तैयार करेगी जो विस्तार करता है SomeClass। यह अभी भी गुमनाम है, के कारण है {...}
स्कफमैन

1
मैं देख रहा हूं, मैंने {...} की अनदेखी की।
lixiang

36

एक अनाम वर्ग आमतौर पर एक इंटरफ़ेस लागू करता है:

new Runnable() { // implements Runnable!
   public void run() {}
}

JFrame.addWindowListener( new WindowAdapter() { // extends  class
} );

अगर आपको लगता है कि आप 2 या अधिक इंटरफेस लागू कर सकते हैं , तो मुझे लगता है कि यह संभव नहीं है। फिर आप एक निजी इंटरफ़ेस बना सकते हैं जो दोनों को जोड़ता है। हालांकि मैं आसानी से कल्पना नहीं कर सकता कि आप एक अनाम वर्ग क्यों चाहते हैं:

 public class MyClass {
   private interface MyInterface extends Runnable, WindowListener { 
   }

   Runnable r = new MyInterface() {
    // your anonymous class which implements 2 interaces
   }

 }

मुझे यह उत्तर पसंद है क्योंकि यह उन लोगों के लिए अनुकूल है, जो अननोन कार्यान्वयन में 2 या अधिक इंटरफेस की तलाश कर रहे हैं।
एल। हॉलैंड

16

बेनामी कक्षाएं हमेशा सुपरक्लास या इम्प्लीमेंट इंटरफेस का विस्तार करती हैं। उदाहरण के लिए:

button.addActionListener(new ActionListener(){ // ActionListener is an interface
    public void actionPerformed(ActionEvent e){
    }
});

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


11

मुझे लगता है कि किसी को भी सवाल समझ में नहीं आया। मुझे लगता है कि इस आदमी को क्या चाहिए था कुछ इस तरह से:

return new (class implements MyInterface {
    @Override
    public void myInterfaceMethod() { /*do something*/ }
});

क्योंकि यह कई इंटरफ़ेस कार्यान्वयन जैसी चीजों की अनुमति देगा:

return new (class implements MyInterface, AnotherInterface {
    @Override
    public void myInterfaceMethod() { /*do something*/ }

    @Override
    public void anotherInterfaceMethod() { /*do something*/ }
});

यह वास्तव में वास्तव में अच्छा होगा; लेकिन यह जावा में अनुमति नहीं है

आप क्या कर सकते हैं विधि खंडों के अंदर स्थानीय कक्षाओं का उपयोग करें :

public AnotherInterface createAnotherInterface() {
    class LocalClass implements MyInterface, AnotherInterface {
        @Override
        public void myInterfaceMethod() { /*do something*/ }

        @Override
        public void anotherInterfaceMethod() { /*do something*/ }
    }
    return new LocalClass();
}

वास्तव में, यह वही है जो ओपी का इरादा IMHO है
डैनियलकुआड्रा

पूछे गए प्रश्न का उत्तर देने के लिए एक अंगूठे को पकड़ें। एसओ पर यह सामान्य है कि लोग जवाब देना पसंद करते हैं कि क्या नहीं पूछा जाना चाहिए।
mfaisalhyder

3
// The interface
interface Blah {
    void something();
}

...

// Something that expects an object implementing that interface
void chewOnIt(Blah b) {
    b.something();
}

...

// Let's provide an object of an anonymous class
chewOnIt(
    new Blah() {
        @Override
        void something() { System.out.println("Anonymous something!"); }
    }
);

1

एक अनाम वर्ग उदाहरण के लिए अपनी वस्तु बनाते समय विस्तार या कार्यान्वित कर रहा है:

Interface in = new InterFace()
{

..............

}

यहां अनाम वर्ग इंटरफ़ेस लागू कर रहा है।

Class cl = new Class(){

.................

}

यहाँ अनाम वर्ग एक अमूर्त वर्ग का विस्तार कर रहा है।


मुझे अंतर नहीं दिखता। तुम्हारा कैसे अलग है फिर मेरा।
trapedInBatcaveWithBAtman

एक अच्छा और कॉम्पैक्ट एक, जो मैं आपको याद करता हूं, वह उत्तर "हमेशा" या "अवश्य" जैसा शब्द है :)
kiedysktos
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.