Dün iki saatlik bir teknik telefon görüşmesi yaptım (geçtim, woohoo!), Ancak Java'da dinamik bağlama ile ilgili aşağıdaki soruyu tamamen boğdum. Ve bu iki kez kafa karıştırıcı çünkü birkaç yıl önce asistanlık yaparken bu kavramı lisans öğrencilerine öğretiyordum, bu yüzden onlara yanlış bilgi verme ihtimalim biraz rahatsız edici ...
İşte bana verilen sorun:
/* 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);
}
}
Çıktının geçersiz kılınan equals()
yöntem içinden iki ayrı baskı ifadesi olması gerektiğini iddia ettim : at t1.equals(t3)
ve t3.equals(t3)
. İkinci durum yeterince açıktır ve ilk durumda, t1
Object türünde bir referansa sahip olmasına rağmen , Tip Test olarak somutlaştırılmıştır, bu nedenle dinamik bağlama, yöntemin geçersiz kılınan biçimini çağırmalıdır.
Görünüşe göre öyle değil. Görüşmeci, programı kendim yürütmem için beni cesaretlendirdi ve bakın, geçersiz kılınan yöntemden yalnızca tek bir çıktı vardı: satırda t3.equals(t3)
.
O zaman sorum şu, neden? Daha önce bahsettiğim gibi, t1
Object türünün bir referansı olsa da (bu nedenle statik bağlama, Object'in equals()
yöntemini çağırır ), dinamik bağlama , referansın somutlaştırılmış türüne dayalı olarak yöntemin en spesifik sürümünü çağırmaya dikkat etmelidir . Neyi kaçırıyorum?