2017-10-24 9 views
1

에 새로운 방법을 추가하는 예입니다익명 class.We이 클래스 methods.This를 대체하는 데 사용할 수 있습니다에 대해 내가 알고있는 기존의 클래스

public class User { 
    private final String name; 
    public User(final String name){ 
     this.name=name; 
    } 
    public void sayHello(){ 
     System.out.println("Hello : "+name); 
    } 
    public static void main(String[] args) { 
     User s = new User("CHORT"){ 
     @Override 
     public void sayHello(){ 
      System.out.println("HELLO FROM ANONYMOUS CLASS"); 
     } 
    }; 

    } 
} 

하지만 난 다음의 제휴도 (올바른으로 강조 표시되지 않은 것으로 나타났습니다 내 IDEA)

public class User { 
    private final String name; 
    public User(final String name){ 
     this.name=name; 
    } 
    public void sayHello(){ 
     System.out.println("Hello : "+name); 
    } 
    public static void main(String[] args) { 
     User s = new User("CHORT"){ 

     public void sayHello2(){ 
      System.out.println("HELLO FROM ANONYMOUS CLASS"); 
     } 
    }; 

    } 
} 

하지만 난이 방법 sayHello2를 호출 할 때, IDEA는이 제휴의 목적 exist.What하지 않는 것을 나에게 보여?

답변

4

우선 제목의 제목이 잘못되었습니다. 기존 클래스에 새 메소드를 추가하지 않았습니다. 기존 클래스를 확장하는 익명 클래스에 메서드를 추가했습니다.

익명 클래스에는 일반 클래스에서 수행하는 모든 메서드가 포함될 수 있습니다. 그들은 자신이 확장 한 클래스의 메소드 나 그들이 구현하는 인터페이스 만 포함 할 필요가 없습니다.

따라서 익명 클래스에서 sayHello2을 정의하는 것은 완전히 유효하지만 익명 클래스 클래스 외부에서 해당 메서드를 호출 할 수 없기 때문에 완전히 쓸모가 없습니다.

User s = new User("CHORT") { 
    @Override 
    public void sayHello() { 
     sayHello2(); 
    } 
    private void sayHello2() { 
     System.out.println("HELLO FROM ANONYMOUS CLASS"); 
    } 
}; 
을 : 당신은 익명 클래스 본문 내에서 호출 할 (그리고 그것은 어쨌든 외부에서 호출 할 수 없기 때문에 당신이 그것을 private를 할 수 있습니다) 경우, 다른 한편으로

, 그것은 유용 할 수 있습니다

EDIT : 내가 생각한 또 다른 한가지는 아마도 당신이 왜 반성을 사용하여 외부에서 sayHello2으로 전화를 할 수 있겠지만, 왜 그렇게하고 싶지는 모르겠다.