어제 2 시간 동안 기술 전화 인터뷰를했지만 (우후!), Java의 동적 바인딩에 관한 다음 질문을 완전히 엉망으로 만들었습니다. 그리고 제가 몇 년 전 조교 였을 때 학부생들에게이 개념을 가르 치곤했기 때문에 두 배로 당혹 스럽습니다. 그래서 제가 그들에게 잘못된 정보를 주었다는 전망이 조금 불안합니다 ...
내가받은 문제는 다음과 같습니다.
/* What is the output of the following program? */
public class Test {
public boolean equals( Test other ) {
System.out.println( "Inside of Test.equals" );
return false;
}
public static void main( String [] args ) {
Object t1 = new Test();
Object t2 = new Test();
Test t3 = new Test();
Object o1 = new Object();
int count = 0;
System.out.println( count++ );// prints 0
t1.equals( t2 ) ;
System.out.println( count++ );// prints 1
t1.equals( t3 );
System.out.println( count++ );// prints 2
t3.equals( o1 );
System.out.println( count++ );// prints 3
t3.equals(t3);
System.out.println( count++ );// prints 4
t3.equals(t2);
}
}
출력은 재정의 된 equals()
메서드 내 에서 at t1.equals(t3)
및 t3.equals(t3)
. 후자의 경우는 충분히 명확하며 전자의 경우 t1
Object 유형의 참조가 있더라도 Test 유형으로 인스턴스화되므로 동적 바인딩은 메소드의 재정의 된 양식을 호출해야합니다.
분명히 아닙니다. 내 면접관은 나에게 프로그램을 직접 실행하도록 격려했고, 보라, 재정의 된 메소드에서 단 하나의 출력 만 있었다 : at the line t3.equals(t3)
.
내 질문은, 왜? 이미 언급했듯이, t1
은 Object 유형의 참조 임에도 불구하고 (정적 바인딩이 Object의 equals()
메소드를 호출 함 ) 동적 바인딩 은 참조의 인스턴스화 된 유형을 기반으로 가장 구체적인 버전의 메소드를 호출 해야합니다 . 내가 무엇을 놓치고 있습니까?