2015-01-27 14 views
7

Özet olmayan soyut bir soyut yöntem Anonim sınıf kullanılarak geçersiz kılınabilir mi? FindBugs aracı "Anonim sınıfın hesaplanamaz yöntemi" sorunu yayınlıyor. Lütfen daha fazla bilgi için aşağıdaki örneği kontrol edin:Anonim bir sınıf, soyut sınıfın soyut olmayan yöntemini uygulayabilir mi?

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

Evet, bu mümkün. Bu tam örnek (kopyalanmış ve yapıştırılmış, hiç değişiklik yok) uyarı üretiyor mu? – immibis

+0

Tabii ki bunu geçersiz kılabilirsiniz, ancak yapmasanız bile, anonim sınıf hala bir uygulama sağlar, bu yüzden daha iyi bir soru olur: anonim bir sınıf bu yöntemi uygulayamaz mı? – Stultuske

+0

Merhaba immibis, Örneğimi düzenledim. Lütfen takip ettiğim örneği kontrol edin. –

cevap

2

Evet, bu mümkün. Son olmayan, statik olmayan tüm yöntemleri geçersiz kılabilirsiniz

+0

JAVA'da 'main()' işlevini geçersiz kılabilir miyim? Statik ama yapabilirim! – Junaid

+0

Ancak, Yukarıdaki kod için FindBugs şunu söyleyen bir hata bildirdi: Bu anonim sınıf doğrudan çalıştırılmayan ve bir üst sınıftaki bir yöntemi geçersiz kılmayan bir yöntem tanımladı. [FindBugs ™ açıklamasından] (http://10.36.18.158:50000/docs/en/findbugs/fb_checker_ref.html#FB.UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS) –

+0

@Junaid no, yapamazsınız. – stuXnet

1

Evet, bu mümkün!

Nedeni?

Anonim sınıf, bir sınıfı aynı anda bildirmenizi ve başlatmanızı sağlar ve örnek kodunuzda bu satırdır: (DerivedAbstractClass derivedAbstractClass = new DerivedAbstractClass()).

Anonim Sınıflar, adlarının olmaması dışında yerel sınıflara benzerler.

Aşağıdaki kesikli şekilde, DerivedAbstractClass'ı genişletiyorsunuz ve soyut yöntemleri için uygulamalar sağlayabiliyorsunuz ve isterseniz de soyut olmayan yöntemi de geçersiz kılabilirsiniz.

Ama gerekirse aşağıdaki gibi geçersiz kılma önce super.nonAbstractMethod(); çağırmak isteyebilirsiniz:

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

       } 

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