เมื่อวานนี้ฉันมีการสัมภาษณ์ทางเทคนิคทางโทรศัพท์สองชั่วโมง (ซึ่งฉันผ่านไปแล้วววว!) แต่ฉันก็ไม่เข้าใจคำถามต่อไปนี้เกี่ยวกับการผูกแบบไดนามิกใน 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);
}
}
ฉันยืนยันว่าผลลัพธ์ควรเป็นคำสั่งพิมพ์สองชุดแยกกันจากภายในequals()
วิธีการแทนที่: ที่t1.equals(t3)
และt3.equals(t3)
. กรณีหลังมีความชัดเจนเพียงพอและในกรณีก่อนหน้านี้แม้ว่าจะt1
มีการอ้างอิงประเภท Object แต่ก็มีการสร้างอินสแตนซ์เป็น type Test ดังนั้นการผูกแบบไดนามิกควรเรียกรูปแบบที่ถูกแทนที่ของวิธีการ
ชัดเจนว่าไม่. สัมภาษณ์ของฉันสนับสนุนให้ฉันไปเรียกใช้โปรแกรมตัวเองและแท้จริงและดูเถิดมีเพียงการส่งออกเพียงครั้งเดียวจากวิธีการแทนที่: t3.equals(t3)
ที่บรรทัด
คำถามของฉันคือทำไม? ดังที่ฉันได้กล่าวไปแล้วแม้ว่าt1
จะเป็นการอ้างอิงประเภท Object (ดังนั้นการผูกแบบคงที่จะเรียกใช้equals()
เมธอดของ Object ) การผูกแบบไดนามิกควรดูแลการเรียกใช้เวอร์ชันที่เฉพาะเจาะจงที่สุดของวิธีการตามชนิดของการอ้างอิง ฉันขาดอะไรไป?