昨日、2時間の電話による技術面接を受けましたが(合格しました、woohoo!)、Javaでの動的バインディングに関する次の質問を完全に消し去りました。そして、私が数年前にTAだったときにこの概念を学部生に教えていたので、それは二重に不可解です。そのため、私が彼らに誤った情報を与えたという見通しは少し不安です...
これが私に与えられた問題です:
/* 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);
}
}
出力は、オーバーライドされたメソッド内からの2つの別個のprintステートメントである必要があると断言しましたequals()
:att1.equals(t3)
とt3.equals(t3)
。後者の場合は十分に明白であり、前者の場合、t1
Object型の参照がありますが、Test型としてインスタンス化されるため、動的バインディングはオーバーライドされた形式のメソッドを呼び出す必要があります。
どうやらそうではありません。私のインタビュアーは私に自分でプログラムを実行するように勧めました、そして見よ、オーバーライドされたメソッドからの出力は1つだけでした:行でt3.equals(t3)
。
私の質問は、なぜですか?すでに述べたようt1
に、タイプObjectの参照ですが(静的バインディングはObjectのequals()
メソッドを呼び出すため)、動的バインディングは、インスタンス化されたタイプの参照に基づいて、メソッドの最も具体的なバージョンを呼び出すように処理する必要があります。私は何が欠けていますか?