2015-01-27 9 views
7

익명 클래스를 사용하여 추상 클래스가 아닌 추상 메서드를 재정의 할 수 있습니까? FindBugs 도구가 "Uncallable method of anonymous class"문제를 발행하고 있습니다. 자세한 내용은 아래 예제를 참조하십시오.익명 클래스가 추상 클래스의 비 추상 메서드를 구현할 수 있습니까?

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

Hello immibis, 나는 나의 예를 편집했다. 제가 따르고있는 정확한 예를 확인하십시오. –

답변

2

예, 가능합니다. 비 정적, 비 정적 메서드를 무시할 수 있습니다

+0

JAVA에서'main()'을 무시할 수 없습니까? 그것은 정적이다. 그러나 나는 할 수있다!! – Junaid

+0

하지만 위의 코드에서 FindBugs는 다음과 같은 버그를보고했습니다.이 익명 클래스는 직접 호출되지 않고 수퍼 클래스의 메서드를 재정의하지 않는 메서드를 정의했습니다. [FindBugs ™ 설명] (http://10.36.18.158:50000/docs/ko/findbugs/fb_checker_ref.html#FB.UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS) –

+0

@Junaid 아니, 할 수 없습니다. – 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  
       } 
      };