2015-01-27 29 views
7

È possibile sovrascrivere un metodo astratto di classe astratta utilizzando la classe anonima ?. Lo strumento FindBugs sta emettendo il problema "Uncallable method of anonymous class". Per ulteriori informazioni, consultare l'esempio seguenteUna classe anonima può implementare il metodo non astratto della classe astratta?

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

Sì, è possibile. Questo esatto esempio (copiato e incollato, nessuna modifica) genera l'avviso? – immibis

+0

Ovviamente puoi sovrascriverlo, ma anche se non lo fai, la classe anonima fornisce ancora un'implementazione, quindi una domanda migliore sarebbe: una classe anonima non può implementare questo metodo? – Stultuske

+0

Ciao immibis, ho modificato il mio esempio. Si prega di verificare l'esatto esempio che sto seguendo. –

risposta

2

Sì, questo è possibile. È possibile eseguire l'override di qualsiasi metodo non statico non statico

+0

Non riesco a sovrascrivere 'main()' in JAVA? È statico ma posso !! – Junaid

+0

Ma, per il codice sopra riportato, FindBugs ha segnalato un errore nel dire che: questa classe anonima ha definito un metodo che non è invocato direttamente e non sovrascrive un metodo in una superclasse. [Dalla descrizione di FindBugs ™] (http://10.36.18.158:50000/docs/en/findbugs/fb_checker_ref.html#FB.UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS) –

+0

@Junaid no, non è possibile. – stuXnet

1

Sì, è possibile!

Motivo?

La classe anonima consente di dichiarare e creare un'istanza di una classe allo stesso tempo e nel codice di esempio questa è la riga: (DerivedAbstractClass derivedAbstractClass = new DerivedAbstractClass()).

Le classi anonime sono come le classi locali tranne che non hanno un nome.

Nello schema seguente, si estende DerivedAbstractClass e si possono fornire implementazioni per i suoi metodi astratti e, se lo si desidera, è possibile anche sovrascrivere il metodo non astratto.

Ma si consiglia di chiamare super.nonAbstractMethod(); prima sovrascrivendo se necessario, come di seguito:

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

       } 

       @Override 
       public void nonAbstractMethod() { 
       super.nonAbstractMethod(); 
       //anonymous clas overriding  
       } 
      }; 
Problemi correlati