目錄
補充:面試未通過
一輪 電話面試
2019.04.28 16:21
[w]:面試官,[m]:我,下面的內容來自電話錄音。
[m]:喂,喂
[w]:喂你好,請問是xxx同學嗎?
[m]:對,是的;
[w]:你好,我這邊是上海愛奇藝,之前和你約好下午有電話面試,你現在那邊OK嗎?
[m]:可以啊
[w]:你那邊信號好嗎?聽我說話聽的清楚嗎?
[m]:聽得清楚呀,你那邊聽得清楚我說的嗎?
[w]:嗯,我這邊聽得清楚
[w]:行,那我們就開始;
[w]:我先問一下,你現在人在哪個城市啊?
[m]:在蘇州呀
[w]:蘇州,就是中科大蘇州這邊軟院是吧;
[m]:對
[w]:嗯好的,你平時開發的主語言是Java嗎?
[m]:對啊,是Java;
[w]:好的,那我主要是問一下Java相關的一些基礎知識
[m]:哦,行
[w]:Java有個最基本的類Object,這個類默認包含哪幾個方法?
[m]:wait,notify,notifyAll,finalize,toString,hashCode,equals;
[w]:還能想到其他的嗎?
[m]:沒有了啊,想不到了;
記:還有:clone、getClass;
[w]:好,那我再換一個東西問,
Java里面,你日常寫代碼中遇到過哪些Exception,能舉一些例子出來嗎?
[m]:空指針、角標越界,Emmm...能想到的是這兩個
[w]:還能想到其他的嗎?
[m]:其他的,在寫測試的時候會用到那個什么...Interr...就是打斷的異常,Intercept異常。(其實是InterruptedException)
記:面試官主要是想看你遇到哪些異常,然后來推斷你的實踐范圍和能力。
[w]:好,我問一下
Java里面有那個==,它和Java的equals方法有什么區別?
[m]:等號(==)就是看一下那兩個對象(引用)是否指向同一個內存空間,就真的是相等;equals的話,那個Object里面equals()默認的話就是用==,所以你可以覆寫的話,就可以自己去定義一下是否相等;
[w]:能說一下
有沒有什么很經典的場景,或者很經典的類是覆寫了這個方法嗎?
[m]:String類;
這塊答得還闊以;
[w]:好,問一下
Java創建線程有哪幾種方法?
[m]:可以寫一個類去繼承Thread那個類,然后....(我還沒說完)
[w]:嗯,還有其他的嗎?
[m]:還有直接寫個Runnable類(子類),傳到Thread的構造函數里面;
[w]:還有其他的嗎?
[m]:還有一個是Callable,就是實現這個接口,用Callable....(還是沒說完)
[w]:
那個Callable和Runnable有什么區別?
[m]:Callable它有個返回值,返回一個Future,然后...(再次沒說完)
[w]:問一下,
如果我們創建了這個線程,我想執行這個線程中的具體邏輯,我可以調用這個線程的start()方法去執行它,也可以調用這個線程的.run()方法去執行它,這兩種執行方式有什么區別嗎?
[m]:.run()的話就是不開啟線程,就是直接調用個方法,.start()方法就是開啟個線程吧;
[w]:好,問一下
Java線程中的sleep方法和wait方法有什么區別?
[m]:sleep的話就是睡了,它不會釋放鎖,wait的話就是先要獲得那個鎖,才能釋放;
[w]:
處於wait狀態的線程要用什么命令去喚醒它?
[m]:用notify,notifyAll;
[w]:
notify和notifyAll有什么區別?
[m]:notify就是喚醒其中一個吧,notifyAll的話就是喚醒等待這個鎖的所有線程;
[w]:如果現在有很多個線程在等待中,
你不調用notifyAll(),而是調用notify(),會喚醒哪一個?
[m]:是喚醒隨機一個吧(其實我也不太確定);
這塊答得馬馬虎虎,有一些問題不太確定;
[w]:我再問一下,Java里面的多態相關的概念,
多態里面有兩個經典概念,一個叫重載,一個叫重寫,能說一下這兩個有什么區別嗎?
[m]:重載的話,你可以不用涉及到什么父類之類的,定義一個方法的唯一標識就是方法名稱、參數類型、參數個數,方法名稱相同,參數類型,參數個數,這兩個不同的話,那就是重載;
[w]:嗯,重寫呢?
[m]:重寫的話,就是要和父類相關,方法名稱要相同,參數類型、參數個數要相同,可以把父類的方法覆寫,實現自己的方法;
[w]:我問一個場景:
你在子類中寫了一個方法,它和父類的那個方法,方法名字是一模一樣的,參數的類型和參數的個數列表也都一模一樣,唯獨返回類型不同,這樣你調用這個子類方法,會返回哪一個?
[m]:返回類型不同的是吧,就調用子類的呀;哦,不對,這個它也實現了嘛,重寫,因為標識就是方法名稱、參數個數、參數類型都相同的話,調的應該就是子類的;(其實我感覺這里是有問題的,但是不太確定)
[w]:我問一下,
如果是在同一個類里,你寫了兩個方法,方法名一模一樣,參數列表一模一樣,唯獨返回類型不同,調用的時候會執行哪一個?
[m]:這可以嗎?
[w]:這個不可以在哪里?
[m]:這個東西就是....它,如果你定義返回類型,哦...返回類型....(有點不自信)不好意思,剛才突然打斷了,就是兩個方法同名是嗎...(面試官get到我的疑惑了)
[w]:對,就是在同一個類里,你寫了兩個方法,方法名一模一樣,參數列表一模一樣,唯獨返回類型不同;
[m]:返回類型不同,然后咧?然后調用哪個???然后就沒有了嗎?但我覺得這個就,我沒見過這樣寫的,而且感覺定義會有問題啊,返回類型不同定義會有錯誤,編譯會有問題;
[w]:如果這種編譯會錯誤,那么前面那種編譯為什么不會錯誤?
[m]:對喔,前面那個也會有問題哦...
[w]:行,這塊你回去再理解一下,或者你再查查資料,但是還可以;
這塊答得不行,就是對知識點理解的不充分,所以才不自信;
[w]:我接着問一下
Java 的垃圾回收你有多少了解?
[m]:GC是吧,就是....額....也不是很深,但稍微了解過,看過那本《深入理解JVM虛擬機》
[w]:我這么問吧,
Java如果我們想要了解它虛擬機的話,常常會在JVM虛擬機中設置一些參數,比如說:Xmx,Xms,這些參數有見過嗎?了解它什么含義嗎?
[m]:就是指定那個堆空間大小吧,-Xms、-Xmx,就是指定堆空間的大小,會有限制,最大或最小;
記:
- 其實GC這部分我還是了解過一些的,比如GC分代、回收算法、標記算法,但是我確實不敢說我了解的有多深;
- 對於Xms和Xmx的回答,我可能答錯了,所以面試官直接跳到下一個模塊來問;
[w]:嗯,行,我問一下那個Linux你了解嗎,我看到你簡歷有寫:你有Linux基本的使用技能;我問一些Linux的基礎命令;
[m]:呵....你問吧
[w]:
在Linux命令中,重命名一個文件用什么命令?
[m]:move,mv
[w]:
如果在Linux里面,想要找到這台機器上的所有tomcat進程,要用什么命令?
[m]:tomcat進程是吧,ps -aux | grep tomcat
這塊還可以吧;
[w]:嗯,好,問一下一些基礎的....你們有沒有學數據結構和算法相關的東西?
[m]:學了一些;
[w]:嗯,
那個排序算法里面有一個比較經典的概念,就是叫做“穩定性”吧,我們經常說有些排序算法是穩定的,有些是非穩定的,這個穩定指的是什么意思,知道嗎?
[m]:知道呀,比如說有原始數據,1,1,就是兩個1嘛,一個是在角標1,一個是在角標2,排序過程中,如果是穩定性算法的話,這兩個數字的相對位置是不會發現變化的,不穩定的話....(還沒說完)
[w]:這樣,我接着這個問,
哪些是穩定的排序算法?
[m]:穩定的算法,冒泡吧,插入排序,Emmm....想一想,現在想到的是這兩個;
[w]:嗯,行,就這個里面我再抽一個追問一下,
剛剛你提到了冒泡排序,你現在能回憶一下冒泡排序的過程,我問這么一個問題,如果需要我們把冒泡排序改造成非穩定的,要怎么改?
[m]:改造成非穩定的,就是它會跟前面一個元素比較嘛,如果相等的話就把那個位置給換一下;
這塊還闊以吧;
[w]:嗯,好的,OK,你們這邊的情況我基本了解,我再問一下其他的一些情況,就是你期末考試是到什么時候啊?如果你能夠過來實習的話,你是什么時候才能開始實習?
[m]:7月10多號結束吧,我們這邊校歷上是這樣寫的;
[w]:7月多少號?
[m]:這個我具體時間我記不清楚了,應該就是7月10幾號,我現在就可以看一下;
[w]:7月10幾號....
[m]:對,實習的話就是我結束之后,考完試后我就可以去;
[w]:嗯,大概可以實習多久呢?
[m]:大概的話,就是....(還沒說完)
[w]:可以實習到明年這個時候嗎?
[m]:可以呀,但是我想先問一下,就是那邊實習的話,工作內容是否可以寫論文,就是我們這邊實習需要寫論文;
[w]:額,放心,這邊都是這個樣子的,我把我這邊的情況先給你介紹一下好吧;
[w]:我們這邊其實大量是你們中科大的學長在這邊實習,一般就是在自己的工作崗位上,用開發的內容就順便把論文一起寫了,一代一代都是這樣子(說到這里,我噗笑了一下)。就是蘇州中科大軟院我們這邊非常熟,你們的每一代學長都在我們這邊有大量的同學,所以你看到的貼子應該是由內網,或者由內部院里發出來的對吧;
[m]:我看到的貼子是我同學在群里轉發的;
[w]:哦(面試官笑了下),好吧,反正就是說是一代代學長們....你們的學長們都是在這邊寫畢業論文的,畢設的這個問題不是問題。所有同學到來年3月份,你開題的時候,我們都會給你題目,基本上就是跟你工作相關的內容,然后就是可以....比較放心吧。畢設的這個事情不用太擔心。
[m]:嗯;
[w]:嗯,行,我覺得基本上,電話這輪應該是過了。之后的話,HR還會和你約一個面試,我想一下,你在蘇州,其實是這樣子,還是有一輪代碼的面試,代碼面試就比電話里復雜一點,會出一兩個代碼題讓你寫。盡可能是...因為,其實從你從蘇州中科大來公司其實也很近,OK的話就約一個現場面試吧,到時候我通知HR。我具體說一下,其實你從蘇州學校到愛奇藝這邊來大概兩個小時左右,因為那蘇州高鐵站不是坐20塊錢的動車坐到上海虹橋火車站,愛奇藝就在上海虹橋火車站旁邊,那這樣的話你覺得OK的話,我就找HR約一下現場的面試,看你哪天有空你就來一下我們這邊。
[m]:也行;
[w]:嗯,可以吧,那就,那就,具體時間,到時候可能在51之后的那一周吧,看你哪一天有空都行,隨便抽一個下午過來,到了這邊現場的話應該需要2~3個小時,就是方便的話,最好在下午的2點鍾,或3點鍾來,你晚上還能做個高鐵回去。這樣OK嗎?
[m]:噢...噢...可以可以
[w]:行,好的,那我就跟你約一個下周的現場面試,到時候你可以做點准備。但是其實就和網上差不多,無非就是紙上寫代碼,這樣子的,看一下你實際的代碼本領;好的,OK,那這樣,電話面試就到這邊了。嗯,額....你對我們這邊有什么問題想問的嗎?
[m]:我想問...(話還沒說完)
[w]:或者你可以到現場來,我們在現場聊也一樣的(面試官也笑了),到這邊,到愛奇藝公司來看一看,然后上海愛奇藝里你們很近。你們往年有很多學長都在我們這邊。好的,那就這樣,那今天電話就到這邊;
[m]:嗯,好好...謝謝
[w]:嗯,好,OK,拜拜
[m]:拜拜
二輪 代碼筆試
2019.05.07 14:00
寫代碼這一輪,是我到上海愛奇藝創新大廈現場進行的。面試官拿幾張白紙過來,然后現場給你想個題目,在紙上畫一畫,把題目給你說明白,下面就是你自己開始手寫代碼了。時間應該是1h,如果你在1h內解題數<=1,可能就不及格了。如果你能力很強,那當然是做出的題越多越好,面試官也是按難度:低->高的模式給你出題的。
解答我就不貼出來了,網上一查挺多的。(
解題不是只寫個思路就OK,一般是要寫個函數,或者難一點的話要寫個類,要求你的代碼是可執行的,導包那些可能不用寫)
題目一 String轉double
給你一個String,內容類似:“3.14159”、“-1294.28842”,不用進行特殊的判斷,比如:小數點存不存在,整數部分存不存在等,讓你把這個String轉換為double類型。(
不能調用現有的轉換函數哦!)
我當時寫的解題思路是:整數部分乘10累加,小數部分除以10累加;
題目二 二叉樹蛇形打印
輸出:a b c g f e d 1 2 3 4 5 6 7 8
我當時寫的解題思路是:一層隊列一層棧;
做完題目1、2,應該還剩20分鍾左右,面試官有點猶豫,一開始說:那我們繼續做個題吧,后面又說:那我們還是看一下簡歷吧。然后花了幾分鍾問了我些簡歷上的基本情況,后面可能他自己想“這部分內容也不是我負責的啊”,然后就給我出了第三個題目。
題目三 動態規划
數字1對應字母a,2對應字母b....26對應z,我們給你一個字母組成的字符串“abc”,你可以轉為“123”。現在是要給你一個數字組成的字符串“123”,讓你求出有多少種可轉成的字符串。比如:
- 123:1-a、2-b、3-c,最后可轉為:abc
- 123:12-l(小寫字母L)、3-c,最后可轉為:lc
- 123:1-a、23-w,最后可轉為:aw
- 所以總共有3種可轉換成的字符串;
這個題我沒寫出來,一開始想分治,后來覺得不對,應該用動態規划。后來時間到了,他說沒事,你回去看一下《算法導論》的動態規划。
2020.02.21 更新,最近刷 LeetCode 刷到了原題,傳送門:https://leetcode.com/problems/decode-ways/,寫了下題解:https://leetcode.com/problems/decode-ways/discuss/515060/Java-1ms-O(N)-96.79
回到目錄
三輪 技術面試
2019.05.07 15:00
這輪面試我感覺自己完全被吊打,前面打小怪感覺良好,后面被Boss反殺。由於是現場面試,就沒錄音,只是根據印象記了些內容,現在整理出來。依舊是[w]:面試官,[m]:我。
[w]:剛才做了什么題目呢?
[m]:一個字符串轉double的,還有一個二叉樹蛇形打印的,還有個動態規划的,動態規划那個題沒做出來。
[w]:嗯,你平常用的是Java是吧?
[m]:對
[w]:(面試官遞給我簡歷)來,
挑一個你熟悉的講一下吧
[m]:(我挑了研一上學期的J2EE課設作業:SimpleController)
[w]:
你這個項目是做什么的?
[m]:(我吧啦吧啦半天好像也沒講明白,一方面表達能力不行,另一方面我不清楚要基於什么樣的粒度去講解)
[w]:
你從這個項目中學到了什么?
[m]:反射機制...(我本來想說反射和動態代理的,但我剛說完反射機制就被[w]打斷了,后來想想,我覺得還是應該把話說完的)
[w]:
那你怎么理解反射機制的呢?
[m]:一般調用對象方法都是用個對象,打點,然后調用的嘛,而反射機制缺可以通過類名、方法名等拿到一個方法調用的句柄,然后通過這個句柄來間接調用方法。(其實我這里寫的還是我整理過的話語,現場我說的可能比這個亂一些)
[m]:(然后我很作死的補充道)有時候使用反射機制去調用對象的私有方法,可能會存在安全性問題。
[w]:
你說反射調用一個對象的私有方法,會有安全性問題對吧,那你怎么解決這個問題呢?
[m]:(我一臉懵逼,后悔不該亂BB的,然后我開始基於事實的亂編),可以通過在對象中設置校驗位來避免。
[w]:校驗位???(面試官腦袋3個問號)
[m]:一個對象的狀態是由它的屬性來表示的嘛,如果通過反射機制來調用對象私有方法,可能會讓對象轉為不確定的狀態(即:按理不應該出現的狀態),那這時候在對象中設置一個校驗位,在方法調用前都會檢測這個校驗位,如果校驗失敗則方法調用失敗。也就是直接調用私有方法會讓校驗位變成“無法通過校驗的值”。可以類比List集合迭代器的過程,如果在遍歷的過程中刪除元素,就會報錯,這里面就是通過一個modCount校驗位來實現的。(我當時的回答沒這么清晰,大概思路就這樣)
[w]:哦(我也不知道他聽懂沒,然后直接跳到下一個話題了)
[w]:
常用的設計模式熟悉嗎?
[m]:我知道一些,比如:單例、工廠...(我話還沒說完)
[w]:
單例,你怎么理解單例的?
[m]:有時候一個類並不需要創建多個對象,其創建一個對象就可以向外提供服務,如果創建多個對象,就會造成內存空間的浪費,所以使用了單例模式來控制對象的創建,保證一個類只有一個實例對象。
[w]:
你能寫出單例模式嗎?
[m]:可以。(然后我寫了第一個版本的:使用靜態內部類來實現)
[w]:你這個編譯有問題啊。(后來我看了下,確實有問題,但當時有點慌,就沒注意到)
[w]:
你為什么使用靜態內部類來實現呢?
[m]:可以延遲加載
[w]:
什么時候會被加載呢?
[m]:當調用那個靜態方法的時候,會加載那個靜態內部類,然后開始加載。
[w]:
靜態內部類你不會寫,那你能寫出其他實現方法嗎?
[m]:可以。(然后我寫了第二個版本:volatile+雙重檢測)
[w]:
你能給我講一下為什么要用雙重檢測嗎?
[m]:(我講了開頭,然后中途不知道腦子怎么想的,突然覺得我寫的是不是哪里有問題。其實我寫的是對的,而且我也確實知道為什么那樣寫。只是當時要給面試官講的時候,邏輯是: 如果這樣子寫,那就會有問題,但是我拿的是正確的代碼來講的,講到途中突然發現沒有出現預想的那個問題,所以突然腦子中斷了一下,就一直沒回過來。后來想想,自己好搞笑。)
[w]:代碼寫的出來,卻不知道為什么?(他心里肯定在想,這小伙子肯定是為了應付面試,去背了代碼。orz...我沒有)
[m]:呵呵...
[w]:
你覺得你的優勢是什么?
[m]:我覺得我學習能力還是比較強的。
[w]:
你能舉個例子說明一下嗎?
[m]:(這個問題我之前從沒准備過,也是現場就編,但也是事實),我們上學期課程高級數據庫有個大作業,要做一個完整的Web項目,旅游預訂系統。我之前沒怎么寫過前端,然后各種查資料看前端內容,包括:bootstrap、Vue等,然后開始寫代碼,最后花了5天時間把這個大作業完成了。雖然這個網站做的不是那么完美,但我這5天看官方文檔、菜鳥教程,基本都是full time寫項目,算是挑戰了自我吧,在這之前我沒想過自己可以完成。
[w]:
5天完成是嗎?只做了前端嗎?
[m]:不是,是全部,包括后端、數據庫這些。
[w]:
那你覺得你的缺點是什么?
[m]:我可能英語要差一些,相對於其他同學。然后表達可能會弱一些,就是腦子里面想得表達出來時不清晰。還有有點偏內向,不太善於社交。
(中間好像還問了什么,沒印象了)
[w]:
好吧,現在來看這么一個題:4x4的方格里,最左下角有一個點A,最右上角有一個點B,規定只有兩種操作:往上移1步,或往右移1步,(注:不會往回走),問:從點A到點B有多少種走法?
(我想了想)
[w]:有思路嗎?
[m]:將右移定位1,上移定為0,那就是取4個1和4個0的排列組合...(我話還沒說完)
[w]:答案是多少?有多少種?
[m]:(我呵呵...)暫時沒想出來。(后來吃飯時候和同學討論,他說是

,不過我當時想的是

,所以需要去重,而怎么去重我一時間沒想到,所以只能老老實實說沒想出來)
[w]:
如果讓你用算法實現,你怎么做呢?
[m]:(我想都沒想)做一個深度優先遍歷吧。
[w]:
你能用動態規划的方法來做嗎?
[m]:(又是動態規划,之前沒怎么刷過這方面的題,撲街)Emmmm,就是定義一個3維數組,g[u][v][?],然后起點(0,0)到其中一個點(0,k),然后再從k開始到終點,計算出這兩個子部分的值,然后把它們相乘。
[w]:什么?3維數組?為什么是3維嗎?我有點沒清楚,你說的(u,v)是啥意思?
(然后我又講了下,也沒講清楚)
[w]:你現在是有個比較清晰的解題思路呢,還是只是有個模糊的解答過程?
[m]:比較模糊吧,我是想定義(u,v),表示節點u到節點v的路徑總數,但是這個節點又是個2維的。
[w]:那你要定義個4維的嗎?(面試官好像笑了下)
[m]:Emmmm,應該不會那么麻煩的,應該有更簡單的解題思路。
[w]:你動態規划方面的題是不是做的不多,我看你簡歷上有些刷題的,有leetcode啊。
[m]:對,我動態規划這部分練的比較少。
[w]:
好吧,那我們再來看下一個場景:N維向量,稀疏矩陣,這個稀疏矩陣中絕大多數是0值,只有很少一部分是非0值。假設有1億維,如何設計一個類去表示這個稀疏矩陣,並且要提供其與另外一個稀疏矩陣相加的操作。
[m]:(這就是涉及大數據的知識了,我的盲區,我想了想,然后說)要壓縮數據,建立一個小一點的數組,去記錄稀疏矩陣中一個非0數后面有多少個0...
[w]:你寫一寫吧,可以寫在白板上。
(我隨便寫了下內部的數據結構,然后他就過來看了。我大概跟他講了一下思路,其實我挺迷的。一開始想到的是在源串上直接壓縮數據,就是1個非0數字后面跟上一個0,0后面有個count值,表示這個非0數字后面0出現的次數,如果非0數字后面直接就是非0值,表示其后面沒有0。這種壓縮方法雖然可以解壓縮,但是一時間沒想到怎么提供加法操作,所以就用了額外的數組來保存count,然后還對原串進行分片....)
[w]:好吧,我大概懂你的思路。(我自己也沒懂,我不知道他怎么懂的😂)
[w]:
你有什么問題想要問我嗎?
[m]:如果我能在愛奇藝工作了,我要做什么內容呢?
(然后他給我講了講他們做的內容)
[m]:能舉個具體點的例子嗎?
(他又跟我說了一會,什么客戶方寫了個spark,打包,交給我們的基礎平台運行。)
[m]:這個架構是什么樣子的?能給我講講嗎?或者畫個圖?
[w]:畫圖就先不畫了,其實網上很多類似的架構,只是每個公司的細節可能不太一樣。
[m]:嗯嗯,好的。
[w]:好吧,那就先面到這里,等我們有消息了再通知你。
[m]:好的。
[w]:我送你下去吧。
[m]:嗯,謝謝。
回到目錄
總結
參考:科軟-實習招聘-筆試面試感悟(2019.03.24~2019.05.12)
附:電話面試問題點解惑
針對電話面試中我不清楚的問題進行回顧。
1 Java有個最基本的類Object,這個類默認包含哪幾個方法?
toString()、equals()、hashCode()、clone()、finalize()、wait()(wait方法有3個重載)、notify()、notifyAll()、getClass();
其實 Object 中還有個靜態的私有本地方法:registerNatives();定義如下:
1 private static native void registerNatives();
2 static {
3 registerNatives();
4 }
關於 registerNatives() 方法,我查了一些資料,是和 JNI(Java Native Interface)有關,先記錄一下查到的資料,后期需要時再深入理解。
相關資料:
2 不調用notifyAll(),而是調用notify(),會喚醒哪一個線程?
notify() API 中有這么一段話:
Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at the discretion of the implementation. A thread waits on an object's monitor by calling one of the wait methods.
譯文:
喚醒正在此對象監視器上等待的單個線程。如果有任何線程正在等待這個對象,則選擇其中一個線程被喚醒。選擇是任意的,由實現決定。線程通過調用一個等待方法來等待對象的監視器。
3 重載和重寫相關問題
3.1 Java 多態里面有兩個經典概念,一個叫重載,一個叫重寫,能說一下這兩個有什么區別嗎?
何為參數列表?
- 參數列表就是一個有序序列,序列的項就是參數類型;
- 比如:void foo(String name, int age, float salary) 這個方法,其參數列表就是[String, int, float],共有3個參數;
參考:《Java程序員面試筆試寶典》4.2.7 重載和覆蓋有什么區別?
重載,是在一個類中多態性的一種表現,是指在一個類中定義了多個方法,這些方法的方法名都相同,參數列表都不同;
在使用重載時,需要注意以下幾點:
- 1)不能通過方法的訪問權限、返回值類型和拋出的異常類型來進行重載;
- 2)對於繼承來說,如果基類方法的訪問權限為 private,那么就不能在派生類對其重載;如果派生類也定義了一個同名的函數,這只是一個新的方法,不會達到重載的效果;
- 3)對於靜態方法,有重載的概念;
重寫,是指子類重寫父類函數。在重寫時需要注意以下幾點:
- 1)子類中的重寫方法必須要和基類中被重寫方法有相同的函數名稱和參數列表;
- 2)子類方法的訪問權限必須大於等於父類方法;
- 3)子類方法的返回類型必須是父類方法返回類型或為其子類型;
- 4)子類方法拋出的異常類型必須是父類拋出異常類型或為其子類型;
- 5)對於靜態方法,並沒有重寫的概念;
重載和重寫的區別主要有以下幾個方面:
- 1)重寫是子類和父類之間的關系,是垂直關系;重載是同一個類中方法之間的關系,是水平關系;
- 2)重寫只能由一個方法或只能由一對方法產生關系;重載是多個方法之間的關系;
- 3)重寫要求參數列表相同;重載要求參數列表不同;
- 4)重寫關系中,調用方法是根據對象的類型(對象對應存儲空間類型)來決定;而重載關系是根據調用時的實參表與形參表來選擇方法體的;(在JVM層面理解,重載是靜態分派過程,重寫是動態分派過程)

其他參考資料:
3.2 在子類中寫了一個方法,它和父類的那個方法,方法名字是一模一樣的,參數的類型和參數的個數列表也都一樣,唯獨返回類型不同,這樣你調用這個子類方法,會返回哪一個?
代碼:
1 public class Father {
2 public void foo(String s, int i) {
3 System.out.println("Father: " + s + ", " + i);
4 }
5 }
6
7 public class Son extends Father {
8 public int foo(String s, int i) {
9 System.out.println("Son: " + s + ", " + i);
10 return 0;
11 }
12 }
編譯錯誤:

3.3 如果是在同一個類里,你寫了兩個方法,方法名一模一樣,參數列表一模一樣,唯獨返回類型不同,調用的時候會執行哪一個?
代碼:
1 public class Son {
2 public int foo(String name, int age) {
3 System.out.println("Son, name = " + name + ", age = " + age);
4 return 0;
5 }
6
7 public void foo(String name, int age) {
8 System.out.println("Son, name = " + name + ", age = " + age);
9 }
10 }
編譯錯誤:

4 有哪些排序算法是穩定的?

我當時答的是:直接插入排序、冒泡排序;
除此外還有:歸並排序、基數排序、計數排序,還是因為不常用的原因,所以印象不深刻;
歸並排序:
轉載請說明出處!have a good time :-)