面試官:Java的重寫和過載有什麼區別?
老讀者都知道了,七年前,我從美女很多的蘇州回到美女更多的洛陽(美化了),抱著一幅“從二線城市退居三線城市”的心態,投了不少簡歷,也“約談”了不少面試官,但僅有兩三個令我感到滿意。其中有一位叫老馬,至今還活在我的微信通訊錄裡。他當時扔了一個面試題把我砸懵了:“王二,Java 的重寫(Override)和過載(Overload)有什麼區別?”
那年我二十三歲,正值青春年華,大約就是周杰倫釋出《八度空間》的年紀,自認為所有的面試題都能對答如流,結果沒想到啊,被“刁難”了——原來洛陽這塊網際網路的荒漠也有技術專家啊。現在回想起來,臉上不自覺地泛起了羞愧的紅暈:主要是自己當時太菜了。不管怎麼說,七年時間過去了,我的技術功底已經非常紮實,有能力寫篇文章剖析一下 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()
方法(無參),但方法體是寫一本《茶花女》。
來寫一段測試程式碼。
public class OverridingTest {
public static void main(String[] args) {
LaoWang wang = new XiaoWang();
wang.write();
}
}
大家猜結果是什麼?
小王寫了一本《茶花女》
在上面的程式碼中,們宣告瞭一個型別為 LaoWang 的變數 wang。在編譯期間,編譯器會檢查 LaoWang 類是否包含了 write()
方法,發現 LaoWang 類有,於是編譯通過。在執行期間,new 了一個 XiaoWang 物件,並將其賦值給 wang,此時 Java 虛擬機器知道 wang 引用的是 XiaoWang 物件,所以呼叫的是子類 XiaoWang 中的 write()
方法而不是父類 LaoWang 中的 write()
方法,因此輸出結果為“小王寫了一本《茶花女》”。
再來看一段過載的程式碼吧。
class LaoWang{
public void read() {
System.out.println("老王讀了一本《Web全棧開發進階之路》");
}
public void read(String bookname) {
System.out.println("老王讀了一本《" + bookname + "》");
}
}
過載的兩個方法名相同,但方法引數的個數不同,另外也不涉及到繼承,兩個方法在同一個類中。就好像類 LaoWang 有兩個方法,名字都是 read()
,但一個有引數(書名),另外一個沒有(只能讀寫死的一本書)。
來寫一段測試程式碼。
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 中兩個非常重要的概念,新手經常會被它們倆迷惑,因為它們倆的英文名字太像了,中文翻譯也只差一個字。難,太難了。
好了,我親愛的讀者朋友,以上就是本文的全部內容了。能看到這裡的都是最優秀的程式設計師,二哥必須要伸出大拇指為你點個贊?。原創不易,如果覺得有點用的話,請不要吝嗇你手中點讚的權力,因為這將是我最強的寫作動力。我們下篇文章見!
相關文章
- #如何看待問“a = a + b和a += b有什麼區別”的Java面試官?Java面試
- 面試官:react和vue有什麼區別嗎?面試ReactVue
- 過載和重寫的區別
- Java—重寫與過載的區別Java
- 【Java面試】IO和NIO有什麼區別?Java面試
- java中過載與重寫的區別Java
- 面試官:BIO、NIO、AIO是什麼,他們有什麼區別?面試AI
- Java中long和Long有什麼區別 (轉載)Java
- 【JAVA】重寫和過載Java
- Java 重寫和過載區別——物件導向的多型性分析Java物件多型
- Java中的過載和重寫Java
- 【Java面試】Mybatis中#{}和${}的區別是什麼?Java面試MyBatis
- Java和Python是什麼?有什麼區別?JavaPython
- java面試題之Thread的run()和start()方法有什麼區別Java面試題thread
- 面試官靈魂三問:什麼是SOA?什麼是微服務?SOA和微服務有什麼區別?面試微服務
- C++中過載、重寫、重定義的區別C++
- 面試官:Golang 的 new 與make 區別是什麼?面試Golang
- Java 介面和抽象類是什麼,有什麼區別Java抽象
- .NET的WCF和WebService有什麼區別?(轉載)Web
- 面試題: Webpack 的 plugin 和 loader 有什麼區別面試題WebPlugin
- 面試官:在原生input上面使用v-model和元件上面使用有什麼區別?面試元件
- java和JavaScript究竟什麼關係,有什麼樣的區別JavaScript
- 面試官:Redis 過期刪除策略和記憶體淘汰策略有什麼區別?面試Redis記憶體
- 類成員函式的重寫,過載和隱藏的區別函式
- 過載(Overload)和重寫(Override)的區別。過載的方法能否根據返回型別進行區分IDE型別
- java泛型中<?>和<T>有什麼區別?Java泛型
- *和body有什麼區別
- 面試突擊:MVCC 和間隙鎖有什麼區別?面試MVC
- iPhone8官翻機和翻新機有什麼區別?怎麼辨別蘋果iPhone官翻機?iPhone蘋果
- 面試題:VueRouter中的 hash 模式和 history 模式有什麼區別面試題Vue模式
- python和Java、C、ruby、PHP有什麼區別?PythonJavaPHP
- Java和HTML有什麼區別?哪個更重要?JavaHTML
- Java NIO和NIO.2有什麼區別? | baeldungJava
- 面試官:什麼是 YAML?和 Spring Boot 有什麼關係?面試YAMLSpring Boot
- 面試官:Dubbo是什麼,他有什麼特性?面試
- 面試官:JavaScript 原始資料型別 Symbol 有什麼用?面試JavaScript資料型別Symbol
- Angular的constructor和ngOnInit裡寫程式碼有什麼區別?AngularStructGo
- java.util.Date和java.sql.Date有什麼區別?JavaSQL