2014-12-09 2 views
2

이 클래스를 고려얼마나 많은 로컬 메서드 익명 클래스가 만들어 졌습니까?

public class Activity { 

    public ArrayList<testInterface> containerListener = new ArrayList<testInterface>(); 

    public void metodoDiProva(int num) { 
     final int finalNum = num; 

     containerListener.add(new testInterface() { 

      @Override 
      public void metodoDiProva() { 
       System.out.println(finalNum); 
      } 
     }); 
    } 
} 

지금 바로이 방법을 찾습니다

public void metodoDiProva(int num) { 
    final int finalNum = num; 

    containerListener.add(new testInterface() { 

     @Override 
     public void metodoDiProva() { 
      System.out.println(finalNum); 
     } 
    }); 
} 

는 예를 들어, metodoDiProva(int num) 2 번이라고 상상해의 ArrayList를 너무

activityObj.metodoDiProva(10); 
activityObj.metodoDiProva(20); 

을 청취자에는 2 개의 객체가 있습니다.

Th E 제 리스너 오브젝트finalNum 변수, 이 변수의 값 10 인을 사용할 수있다.
개체은 finalNum 변수, 이 변수의 값을 사용할 수제 20 청취자이다.

질문은 :
메모리에는 2 개의 다른 InnerClas가 있습니까? 아니면 단지 1 개입니까?

답변

4

아니요, 내부 클래스가 하나만 있습니다. 두 가지 경우가 있습니다. Activity을 컴파일하면 두 개의 .class 파일 인 Activity.classActivity$1.class이 표시됩니다. 여기에서 Activity$1.class은 익명 내부 클래스를 나타냅니다.

+0

감사합니다. firstListener의 경우 finalNum 변수의 값을 10으로 유지하고 두 번째 값이 20 인 경우 누가 감사합니까? listenerObject? 내 말은 : 최종 변수의 값을 유지하는 익명 클래스의 인스턴스입니까? –

+1

내부 클래스는 장면 뒤의 지역 변수에 대한 암시 적 멤버 변수를 가져옵니다. 로컬 변수가 내부 변수와 내부 클래스 사이의 일관성을 보장 할 수 있도록 로컬 변수가 final (또는 Java 8의 경우 효과적으로 final)해야하는 이유이기도합니다. – rgettman

+0

이 이해하지만, 코드를 보면, 첫 번째 Listener에 대해 (익명 클래스 내부의) final 변수의 값은 10이며, secondListener (익명 클래스 내부)의 값은 20입니다. 수업. 그래서 ... 누가 firstListener에 대해 값 10을 유지하고 secondListener에 대해 값 20을 유지합니까? 여전히 내부 익명 클래스 또는 내부 익명 클래스의 인스턴스? –

관련 문제