老讀者都知道了,七年前,我從美女不少的蘇州回到美女更多的洛陽(美化了),抱着一幅「從二線城市退居三線城市」的心態,投了很多簡歷,也「約談」了很多面試官,但僅有兩三個令我感到滿意。其中有一位叫老馬,至今還活在個人微信通信錄裏。他當時扔了一個面試題把我砸懵了:「王二,Java 的重寫(Override)和重載(Overload)有什麼區別?」java
那年我二十三歲,正值青春年華,大約就是周杰倫發佈《八度空間》的年紀,自認爲全部的面試題都能對答如流,結果沒想到啊,被「刁難」了——原來洛陽這塊互聯網的荒漠也有技術專家啊。如今回想起來,臉上不自覺地泛起了羞愧的紅暈:主要是本身當時太菜了。無論怎麼說,七年時間過去了,個人技術功底已經很是紮實,有能力寫篇文章剖析一下 Java 的重寫和重載了,只要能給後來者一些參考,我就以爲作了天大的善事。程序員
好了,讓咱們來步入正題。先來看一段重寫的代碼吧。面試
class LaoWang{
public void write() {
System.out.println("老王寫了一本《基督山伯爵》");
}
}
public class XiaoWang extends LaoWang {
@Override
public void write() {
System.out.println("小王寫了一本《茶花女》");
}
}
複製代碼
重寫的兩個方法名相同,方法參數的個數也相同;不過一個方法在父類中,另一個在子類中。就好像父類 LaoWang 有一個 write()
方法(無參),方法體是寫一本《基督山伯爵》;子類 XiaoWang 重寫了父類的 write()
方法(無參),但方法體是寫一本《茶花女》。bash
來寫一段測試代碼。微信
public class OverridingTest {
public static void main(String[] args) {
LaoWang wang = new XiaoWang();
wang.write();
}
}
複製代碼
你們猜結果是什麼?ide
小王寫了一本《茶花女》
複製代碼
在上面的代碼中,們聲明瞭一個類型爲 LaoWang 的變量 wang。在編譯期間,編譯器會檢查 LaoWang 類是否包含了 write()
方法,發現 LaoWang 類有,因而編譯經過。在運行期間,new 了一個 XiaoWang 對象,並將其賦值給 wang,此時 Java 虛擬機知道 wang 引用的是 XiaoWang 對象,因此調用的是子類 XiaoWang 中的 write()
方法而不是父類 LaoWang 中的 write()
方法,所以輸出結果爲「小王寫了一本《茶花女》」。測試
再來看一段重載的代碼吧。spa
class LaoWang{
public void read() {
System.out.println("老王讀了一本《Web全棧開發進階之路》");
}
public void read(String bookname) {
System.out.println("老王讀了一本《" + bookname + "》");
}
}
複製代碼
重載的兩個方法名相同,但方法參數的個數不一樣,另外也不涉及到繼承,兩個方法在同一個類中。就好像類 LaoWang 有兩個方法,名字都是 read()
,但一個有參數(書名),另一個沒有(只能讀寫死的一本書)。翻譯
來寫一段測試代碼。code
public class OverloadingTest {
public static void main(String[] args) {
LaoWang wang = new LaoWang();
wang.read();
wang.read("金瓶梅");
}
}
複製代碼
這結果就不用猜了。變量 wang 的類型爲 LaoWang,wang.read()
調用的是無參的 read()
方法,所以先輸出「老王讀了一本《Web全棧開發進階之路》」;wang.read("金瓶梅")
調用的是有參的 read(bookname)
方法,所以後輸出「老王讀了一本《金瓶梅》」。在編譯期間,編譯器就知道這兩個 read()
方法時不一樣的,由於它們的方法簽名(=方法名稱+方法參數)不一樣。
簡單的來總結一下:
1)編譯器沒法決定調用哪一個重寫的方法,由於只從變量的類型上是沒法作出判斷的,要在運行時才能決定;但編譯器能夠明確地知道該調用哪一個重載的方法,由於引用類型是肯定的,參數個數決定了該調用哪一個方法。
2)多態針對的是重寫,而不是重載。
哎,後悔啊,早年我要是能把這道面試題吃透的話,也不用被老馬刁難了。吟一首詩感慨一下人生吧。
青青園中葵,朝露待日晞。 陽春佈德澤,萬物生光輝。 常恐秋節至,焜黃華葉衰。 百川東到海,什麼時候復西歸? 少壯不努力,老大徒傷悲
另外,我想要告訴你們的是,重寫(Override)和重載(Overload)是 Java 中兩個很是重要的概念,新手常常會被它們倆迷惑,由於它們倆的英文名字太像了,中文翻譯也只差一個字。難,太難了。
好了,我親愛的讀者朋友,以上就是本文的所有內容了。能看到這裏的都是最優秀的程序員,二哥必需要伸出大拇指爲你點個贊👍。原創不易,若是以爲有點用的話,請不要吝嗇你手中點讚的權力,由於這將是我最強的寫做動力。咱們下篇文章見!