亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java動態綁定和方法覆蓋

Java動態綁定和方法覆蓋

慕婉清6462132 2019-10-15 15:43:05
昨天我接受了兩個小時的技術電話面試(我通過了,woohoo?。?,但是我完全想出了以下有關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類型,因此動態綁定應調用該方法的重寫形式。顯然不是。面試官鼓勵我自己運行該程序,瞧瞧,被覆蓋的方法只有一個輸出:在線t3.equals(t3)。我的問題是,為什么?正如我已經提到的,即使t1是對Object類型的引用(所以靜態綁定將調用Object的equals()方法),動態綁定也應根據引用的實例化類型來調用方法的最特定版本。我想念什么?
查看完整描述

3 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

Java對重載方法使用靜態綁定,而對重載方法使用動態綁定。在您的示例中,equals方法被重載(與Object.equals()具有不同的參數類型),因此所調用的方法在編譯時綁定到引用類型。


這里一些討論


它是equals方法的事實并不重要,除了重載而不是覆蓋它是一個常見錯誤之外,您已經根據面試中對問題的答案意識到了這一點。


編輯:這里也是一個很好的描述。本示例顯示了與參數類型有關的類似問題,但是是由同一問題引起的。


我相信,如果綁定實際上是動態的,則在任何情況下調用方和參數都是Test實例的情況都將導致調用重寫的方法。因此,t3.equals(o1)將是唯一無法打印的情況。


查看完整回答
反對 回復 2019-10-15
?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

equals方法Test不會覆蓋的equals方法java.lang.Object??磪殿愋?!所述Test類被重載equals用一個接受的方法Test。

如果equals要覆蓋該方法,則應使用@Override批注。這將導致編譯錯誤指出此常見錯誤。


查看完整回答
反對 回復 2019-10-15
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

有趣的是,在Groovy代碼(可以將其編譯為類文件)中,除一個調用外,所有調用都將執行print語句。(將測試與對象進行比較的人顯然不會調用Test.equals(Test)函數。)這是因為Groovy DOES完全進行了動態類型化。這是特別令人感興趣的,因為它沒有任何顯式動態鍵入的變量。我已經在幾個地方讀到了這被認為是有害的,因為程序員期望使用groovy來完成Java任務。


查看完整回答
反對 回復 2019-10-15
  • 3 回答
  • 0 關注
  • 498 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號