2012-12-03 2 views
2

이것은 Java에 대한 매우 기본적인 질문 일 수 있습니다. 그러나 나는 그것을 기억할 수 없으며 온라인으로 검색하는 방법을 찾을 수 없습니다.Java에서 호출되는 이러한 종류의 인스턴스화는 무엇입니까?

button.setOnClickListener(new OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
    Thread.sleep(100); 
    } 
} 

나는 new OnClickListener(arg1, arg2, ...) 같은 생성자를 사용하여 객체를 초기화하는 데 사용하고있다. 내 자신의 경험에서 나는 결코 객체를 만들 때 메소드를 오버라이드 (override)하지 않았다. 나는 수업을 연장 할 때만 그것을했습니다. 어떤 종류의 용어가 있다면 Java에서 호출되는 이런 종류의 인스턴스화는 무엇입니까? 다른 어떤 경우에 사용해야합니까?

+1

자바에서 이름이'익명 클래스 '입니다. 이제이 주제에 대한 연구를 진행할 수 있습니다. –

+0

'OnClickListener'는 명확히 익명화 된 인스턴스입니다. – Chan

답변

5

이것은 익명 클래스입니다. 이것은 OnClickListener 인터페이스의 구현이지만 구현에는 이름이 지정되지 않습니다. 간결하게 작성하고 구현은 호출 컨텍스트에서 볼 수 있지만 (종종 읽기 쉽도록 유용함), 구현이 구현되어 있으므로 다른 곳에서는 사용할 수 없습니다.

내부 클래스이기 때문에 주변 클래스에 대한 참조를 가지고 있습니다.

자세한 내용은 here을 참조하십시오.

다시. 주위의 클래스에의 참조 내부 클래스는 외부 클래스에 대한 암시 적 참조를 갖습니다 (예를 들어 XStream을 사용하여 내부 클래스를 serialize하려고하면 볼 수 있습니다. 외부 클래스도 함께 가져옵니다). 당신이 외부 클래스의 변수가있는 경우, 당신은 구문과 의미 관점에서

+0

"주변 클래스에 대한 참조가 무엇"이라는 것이 확실하지 않습니다. 그러한 참조를 사용할 수있는 시나리오를 명명 해주십시오. –

+0

위 내 추가 내용보기 –

3

익명 클래스라고합니다.

기술적으로 이들은 인스턴스화되는 클래스의 서브 클래스이며 대체 된 메소드 구현을 제공합니다.

최상위 클래스를 특별히 선언 할 필요없이 구현을 제공하려는 경우 유용합니다.

이들은 클로저에 대한 Java의 대답입니다.

+1

클로저에 대한 답변이 많지 않습니다. –

+0

클로저에 대한 자바의 대답을 언급 한 +1. –

2
new OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
    Thread.sleep(100); 
    } 
} 

모두 (그것이 final 변수, 마음의 제공) 내부에서 참조 할 수 있습니다,이 구조는 인스턴스의 조화 및 클래스 선언. 동일한 호흡에서 OnClickListener의 호출자 (인터페이스는이 목적을 위해 기본 생성자가 있다고 가정 됨)를 지정하고 선언중인 새 서브 클래스에 속한 클래스 본문을 제공합니다. 하위 클래스에 이름을 지정하지 않으므로이 구조를 "익명 클래스"라고합니다. 익명 클래스를 사용하면 인스턴스화가 선언과 밀접하게 결합되므로 선언 된 위치를 제외하고 코드의 다른 모든 지점에서이 클래스를 인스턴스화 할 수 없습니다.

실제로는 거의 사용되지 않는 자바 구조가 거의 같습니다. 로컬 클래스입니다. 정규 클래스 선언과 비슷하지만 위의 익명 클래스와 마찬가지로 메서드 내에서 이 발생합니다. 이 경우 클래스에는 이름이 주어지며 여러 곳에서 참조 및 인스턴스화 될 수 있지만 선언 된 메소드 내부의 모든 인스턴스가 참조되고 인스턴스화 될 수 있습니다.

두 경우 모두 로컬 변수을 메서드에서 선언 한 기능을 사용할 수있는 다른 클래스에서는 사용할 수없는 특수 기능을 사용할 수 있습니다.메소드가 완료 될 때 지역 변수가 사라지기 때문에 처음에는 이상하지만, 로컬 클래스의 인스턴스에 대한 참조는 계속 생겨납니다. 이것이 이러한 클래스를 "클로저 (closure)"라고 부르는 이유입니다. 로컬 환경을 "폐쇄"한다고합니다. 변수 선언을 "리프트 (lift)"하여 인스턴스 변수로 유지합니다.

1

만이 사용할 수있는 방법의 예를 조금주고 ...

public class TestClass { 
    public static void main(String args[]) { 
     OutOfTheMain ootm = new OutOfTheMain(); 
    } 
} 

public interface SuperInner { 
    String words = "hello"; 
    String getWords(); 
} 

public class OutOfTheMain { 
    OutOfTheMain() { 
     testInnerStuff(new SuperInner() { 
      @Override 
      public String getWords() { 
       return words + " world"; 
      } 
     }); 
    } 

    private void testInnerStuff(SuperInner sinner) { 
     System.out.println(sinner.getWords()); 
    } 
} 

실행이 인쇄 것 ...

hello world 

추가 메소드를 오버라이드 (override) 할 수 있습니다 추가 기능을 사용하고 나중에이 클래스를 런타임에 사용하십시오.

관련 문제