2012-01-18 2 views
4
코드에서

, 즉, myObject가 새로운 객체를 할당 할 때 호출 무엇즉석에서 인스턴스를 만들 때 Java로 불리는 것은 무엇입니까?

class MyObject { 
    public String doThing() { 
     return "doh"; 
    } 
} 

class MyClass { 
    private myObject = null; 
    public MyClass() { 
     myObject = new MyObject() { 
      public String doThing() { 
       return "huh?"; 
      } 
     }; 
    } 

? 나는 기술적으로 "doThing"이 MyObject의 메소드를 오버라이드하는지, 아니면 다시 정의 하는지를 알아 내려고 노력하고 있지만, 무엇을 검색해야 할지를 모르고있다. 그리고 무엇이 문제인지를 모른 채 묻는 질문은 없다. 즉석에서 객체의 새 인스턴스를 만들고 구현을 제공 할 때 호출됩니다.

답변

9

당신은 당신이 무엇을 물어 경우, 그래서 그래, 당신은 doThing 방법을 재정의, MyObject의 서브 클래스 인 익명의 내부 클래스을 만들 수 있습니다.

그런데 익명 클래스는 클래스 이름과 비슷하며 .class 파일에 고유 한 바이트 코드가 있습니다.이 클래스의 이름은 달러 기호와 숫자로 둘러싸인 클래스입니다.

당신이 직접 실험을 할 경우 등 구현 된 인터페이스, 일반적인 인수

2

이 구조체의 이름입니다, 당신은 방법 myObjectgetClass()을 사용할 수 있으며 이름, 부모처럼, 그것에 대해 정보를 추출 Anonymous inner class

당신은 익명의 내부 클래스라고 구글

3

이러한 대한 문서를 많이 찾을 수 있습니다.

doThing() 메서드는 슈퍼 클래스의 공용 메서드와 동일한 서명을 가지므로이 메서드를 재정의합니다.

확신 할 수있는 가장 좋은 방법은 @Override 주석을 하위 클래스의 메서드에 추가하는 것입니다.이 주석이있는 메서드가 메서드를 재정의하지 않으면 컴파일러에서 컴파일 오류가 발생합니다.

1

Java에서는 모든 최종 인스턴스가 아닌 메소드가 재정의 (즉, 가상) 될 수 있습니다. 이는 내부 클래스에도 똑같이 적용되므로 코드가 MyObjectdoThing() 메소드보다 우선합니다.

1

예, doThing() 메서드는 무시됩니다. 이것은 MyObject의 비헤비어를 상속 한 다음 익명 클래스를 오버라이드하는 익명 클래스와 동일합니다.