2015-01-27 8 views
7

बेनामी क्लास का उपयोग कर एक सार वर्ग गैर अमूर्त विधि ओवरराइड किया जा सकता है? FindBugs टूल "अज्ञात वर्ग की अनुपलब्ध विधि" जारी कर रहा है। अधिक जानकारी के लिए कृपया नीचे दिए गए उदाहरण की जांच करेंक्या एक अज्ञात वर्ग अमूर्त वर्ग की गैर अमूर्त विधि को कार्यान्वित कर सकता है?

public class BaseClass { 
    // This class is a Library Class. 
} 

public abstract class AbstractBaseClass extends BaseClass { 
    public abstract void abstractMethod(); 
    public void nonAbstractMethod() {} 
} 

public abstract class DerivedAbstractClass extends AbstractBaseClass { 
    // Here Some more additional methods has been added 
} 

public class DemoAbstract { 

    public static void main(String[] args) { 
     init(); 
    } 

    private static void init() { 
     DerivedAbstractClass derivedAbstractClass = new DerivedAbstractClass() { 
      @Override 
      public void abstractMethod() { 

      } 

      @Override 
      public void nonAbstractMethod() { 
       // Is it possible to override like this? 
      } 
     }; 
    } 
} 
+1

हाँ, यह संभव है। क्या यह सटीक उदाहरण है (कॉपी और पेस्ट किया गया है, बिल्कुल कोई बदलाव नहीं) चेतावनी उत्पन्न करता है? – immibis

+0

बेशक आप इसे ओवरराइड कर सकते हैं, लेकिन यदि आप नहीं करते हैं, तो भी अनाम वर्ग अभी भी एक कार्यान्वयन प्रदान करता है, इसलिए एक बेहतर सवाल होगा: क्या अज्ञात वर्ग इस विधि को लागू नहीं कर सकता है? – Stultuske

+0

हैलो immibis, मैंने अपना उदाहरण संपादित किया है। कृपया सही उदाहरण देखें जो मैं अनुसरण कर रहा हूं। –

उत्तर

2

हां, यह संभव है। आप किसी भी गैर अंतिम, गैर स्थिर विधि

+0

क्या मैं जावा में 'मुख्य()' ओवरराइड नहीं कर सकता? यह स्थिर है लेकिन मैं कर सकता हूँ !! – Junaid

+0

लेकिन, इसके बाद के संस्करण कोड FindBugs एक बग है कि कह सूचना दी है के लिए: यह गुमनाम वर्ग एक विधि है कि सीधे लागू नहीं है और एक सुपर क्लास में एक विधि पर हावी नहीं होता परिभाषित किया। [FindBugs ™ विवरण से] (http://10.36.18.158aks0000/docs/en/findbugs/fb_checker_ref.html#FB.UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS) –

+0

@ जुनाद नहीं, आप नहीं कर सकते। – stuXnet

1

हाँ ओवरराइड कर सकते हैं, यह संभव है!

कारण?

बेनामी क्लास आपको एक ही समय में एक कक्षा घोषित करने और तुरंत चालू करने में सक्षम बनाता है, और आपके नमूना कोड में यह लाइन है: (DerivedAbstractClass derivedAbstractClass = new DerivedAbstractClass())।

बेनामी क्लासेस, सिवाय इसके कि वे एक नाम नहीं है स्थानीय कक्षाओं की तरह हैं।

नीचे कतरना में, आप DerivedAbstractClass बढ़ा रहे हैं और इसके सार तरीकों के लिए कार्यान्वयन प्रदान कर सकते हैं, और यदि आप चाहते हैं, आप भी गैर सार विधि भी पार कर जाते।

लेकिन आप यदि आवश्यक अधिभावी, नीचे के रूप में पहले super.nonAbstractMethod(); कॉल करना चाहते हो सकता है:

DerivedAbstractClass derivedAbstractClass = new DerivedAbstractClass() { 
       @Override 
       public void abstractMethod() { 
       //anonymous clas providing implemntation 

       } 

       @Override 
       public void nonAbstractMethod() { 
       super.nonAbstractMethod(); 
       //anonymous clas overriding  
       } 
      }; 
संबंधित मुद्दे