java方法重載重寫原理學習的簡單總結

概述

根據查看過的 深刻理解JVM 和 鄭雨迪的教程,對java中方法重載的原理進行一個大體總結java

具體總結

在JAVA中,多態主要體現爲方法的重載和重寫。對象

  • 方法重載:同一個類中,方法名相同,參數列表不一樣(在編譯器那層基本不會考慮返回參數)的兩個或多個方法就視爲這個幾個方法是重載的。
  • 方法重寫:對應於父類和子類,方法名和方法描述符相同(參數列表和返回類型組成),就會產生重寫,即子類的方法會覆蓋掉父類的方法(對了,靜態方法的話效果也差很少哦😊,父類的靜態方法會被子類的靜態方法隱藏掉,也和覆蓋差很少)
    • 在java中,是不容許兩個參數列表相同且方法名相同的方法出現的,即便他們的返回類型不一樣,這是在編譯期就已經會檢測的。(之因此強調這個是由於,事實上若是你繞開編譯器,你生成了兩個方法,方法名相同,方法參數列表相同,可是方法返回不一樣,你經過字節碼去調用,一樣是能夠作到重載的,由於在字節碼的層次對於方法的簽名是包含了對返回類型的區分的。。。)

談到「二重奏」,就必需要談到他們在JAVA中的實現原理: 靜態綁定(也叫靜態分派) 和 動態綁定(動態分派).
在JAVA文件編譯的時候,編譯器就會判斷調用的方法的類型,以及這個方法是否能夠直接在編譯時斷定(即斷定是具體哪一個類的哪一個方法),並以此爲依據將方法的調用轉換爲如下幾種字節碼調用:
* invokestatic 靜態方法
* invokespecial 私有實例方法
* invokevitural 非私有實例方法
* invokeinterface 接口方法
* invokedynamic ...教程

  • 靜態綁定
    在實際調用的時候,invokestatic,invokespecial這兩個是靜態綁定的,即在編譯器就確認好了具體調用的是哪一個類的哪一個方法,不須要去尋找。
  • 動態綁定 invokevitural,invokeinterface,invokedynamic這些方法調用的字節碼指令,在執行時,會主動去查找這個方法究竟是屬於哪一個類, 好比對於向上轉型(父類引用指向子類對象)的那種狀況,它就會判斷這個對象的真正類型,而後再從真正類型開始去查找方法。
相關文章
相關標籤/搜索