2012-01-18 2 views
10

Java에서 이와 비슷한 몇 가지 예제를 보았습니다. 어떤 일이 일어 났는지 설명 할 수 있기를 바랍니다. 새로운 클래스가 인라인으로 정의 될 수있는 것처럼 보이는데, 그것은 나에게 정말로 이상하게 보인다. 단순히 toString이기 때문에 첫 번째 출력 라인이 필요합니다. 그러나 2 차 함수는 함수가 오버 라이딩 될 수있는 것처럼 보입니다. 이것에 대한 기술적 인 용어가 있습니까? 또는 더 깊이 들어가는 문서? 감사!Java 인라인 클래스 정의

나는 다음과 같은 코드가있는 경우 :

public class Apple { 
    public String toString() { 
     return "original apple"; 
    } 
} 

public class Driver { 
    public static void main(String[] args) { 
     System.out.println("first: " + new Apple()); 
     System.out.println("second: " + 
      new Apple() { 
       public String toString() { 
        return "modified apple"; 
       } 
      } 
     ); 
    } 
} 

코드 출력 :

first: original apple 
second: modified apple 

답변

15

그것은 익명의 내부 클래스입니다. Inner Classes에 대한 Java 설명서 링크에서 자세한 내용을 확인할 수 있습니다. EDIT 익명의 내부 클래스를 설명하는 better link을 추가하고 있습니다. Java 문서에서 원하는 것을 남겨 놓았 기 때문입니다. /EDIT

대부분의 사람들은 즉석에서 청취자를 정의하는 익명에게 내부 클래스를 사용합니다. 이 시나리오를 고려해보십시오.

나는 Button을 가지고 있으며, 그것을 클릭하면 콘솔에 무언가를 표시하고 싶습니다. 하지만 다른 파일에 새 클래스를 만들 필요가 없으며 나중에이 파일에서 내부 클래스를 정의하지 않으려 고합니다. 바로 논리를 바로 사용할 수 있기를 바랍니다.

class Example { 
    Button button = new SomeButton(); 

    public void example() { 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(SomeClickEvent clickEvent) { 
       System.out.println("A click happened at " + clickEvent.getClickTime()); 
      } 
     }); 
    } 

    interface OnClickListener { 
     void onClick(SomeClickEvent clickEvent); 
    } 

    interface Button { 
     void setOnClickListener(OnClickListener ocl); 
    } 
} 

이 예제는 다소 인위적이며 분명히 완전하지는 않지만 전반적으로 생각이 듭니다.

+0

모두에게 감사드립니다. 나는 이것에 대해 읽으 러 갈 것이다! –

+0

단지 'this'값이 onClick 메서드 내부에있는 Button 인스턴스를 참조한다는 것을 추가하고 싶습니다. onClick 메서드 내부의 Example 인스턴스를 참조하려면 'Example.this'를 사용할 수 있습니다. 정적 인 내부 클래스에는이 참조가 없습니다. – Hoffmann

2

코드에서 어떤 일이 일어나는지는 Apple을 익명의 내부 클래스로 암시 적으로 서브 클래스 화하고 toString() 메서드를 재정의한다는 것입니다.

0

익명 내부 클래스라고하며, herehere에 대해 읽을 수 있습니다.