java中重載、覆蓋和隱藏三者的區別分析

來源:互聯網
上載者:User

重載:方法名相同,但參數不同的多個同名函數

  注意:1.參數不同的意思是參數類型、參數個數、參數順序至少有一個不同

     2.傳回值和異常以及存取修飾詞,不能作為重載的條件(因為對於匿名調用,會出現歧義,eg:void a ()和int a() ,如果調用a(),出現歧義)

     3.main方法也是可以被重載的

覆蓋:子類重寫父類的方法,要求方法名和參數類型完全一樣(參數不能是子類),傳回值和異常比父類小或者相同(即為父類的子類),存取修飾詞比父類大或者相同

   兩同兩小一大

   注意:子類執行個體方法不能覆蓋父類的靜態方法;子類的靜態方法也不能覆蓋父類的執行個體方法(編譯時間報錯),總結為方法不能交叉覆蓋

隱藏:父類和子類擁有相同名字的屬性或者方法時,父類的同名的屬性或者方法形式上不見了,實際是還是存在的

  注意:當發生隱藏的時候,宣告類型是什麼類,就調用對應類的屬性或者方法,而不會發生動態綁定

     方法隱藏只有一種形式,就是父類和子類存在相同的靜態方法

     屬性只能被隱藏,不能被覆蓋

     子類執行個體變數/靜態變數可以隱藏父類的執行個體/靜態變數,總結為變數可以交叉隱藏

隱藏和覆蓋的區別:

  被隱藏的屬性,在子類被強制轉換成父類後,訪問的是父類中的屬性

  被覆蓋的方法,在子類被強制轉換成父類後,調用的還是子類自身的方法

  因為覆蓋是動態綁定,是受RTTI(run time type identification,運行時類型檢查)約束的,隱藏不受RTTI約束,總結為RTTI只針對覆蓋,不針對隱藏

特殊情況:

  1.final修飾的屬性可以被隱藏,但是不能被賦值,即不能用=來賦值,網上說final屬性不能被修改,這個說法不準確,因為對於參考型別的變數用final修飾後,它只是不能被指向其他對象,但是可以改它自身的值,可以用ArrayList測試,final屬性可以在啟動並執行時候進行初始化,但是不能不出現初始化語句

  2.final修飾的方法不能被覆蓋,可以被重載

  3.final修飾的類不能被繼承

  4.private 方法隱式添加了final

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.