面試差點捱揍,原來Java面向對象套路這麼深……

本文是我和xqnode聯合創作,已收錄至我們的GitHub,歡迎大家給個Star:https://github.com/nxJava/nx_java

我們會持續更新,歡迎監督!

微信搜索:武哥聊編程,關注這個Java菜鳥~

小故事

話說這天,正值酷暑,天氣燥熱,武哥卻起了個大早,正對着車鏡子整理油頭。

正巧我準備去買早點,路過看到武哥撅着sexy的屁屁邊哼着小曲兒邊賣弄風騷,實在有點看不過去,真想狠狠踹他兩腳。

武哥似乎發現了我,從車後視鏡裏對着我打招呼,還不忘挑了個眉,那神情,別提有多騷氣。

爲了不跟這貨有什麼說不清道不明的糾纏,我假裝沒看到,加快了點腳步往早點攤奔去。聽說最近地攤經濟特別火,攤點數量也擴大了一倍多,哈哈,終於不用排隊買我最愛喫的豆腐花了。

武哥看我沒搭理他,也沒生氣,繼續整理着頭髮,噴一點發膠,今天換了個小哥哥們都喜歡的分發紋理款,不知道要去迷倒哪位小姐姐。

過了半晌,我早餐都買回來了,特地給武哥帶了倆醬肉包子,路過武哥的車,卻沒看到他人,正奇怪間,一隻鹹豬手悄悄伸了過來。

我還沒反應過來,肉包已經進了武哥嘴裏了。

一口塞兩個包子,真是絕了,腮幫子鼓的老高,那喫相,讓我想起上次在老家喂的“二師兄”。還沒等我說話,武哥就慌忙鑽進車裏,一腳油門就揚長而去,害我喫一臉灰。

你說氣人不?敢情這貨喫早餐連個招呼都不打?不知道這麼火急火燎的是去跟哪家的小姑娘有約。我算是記下了,下次非把他車軲轆卸了。

你別看武哥今天這麼瀟灑,其實他是要去面試的,除了故作鎮定,寵辱不驚外,武哥最拿手的就是吹牛逼。想當初,我跟武哥剛認識那會,他可是喝着啤酒給我吹了一晚上。從他公司老大對他工作的種種苛責說到當代互聯網公司用人管理制度的種種漏洞;從他幼年時期愛慕已久的隔壁小紅到如今上了年紀擺攤賣早點的煎餅西施;從上海蹬着小三輪收廢品到全國各地開演唱會(街頭彈唱賣藝),武哥的人生可以用精彩來形容,他不去寫個自傳真是可惜了。

都是過往雲煙,轉眼武哥來到某某科技公司的大樓下,看着高聳入雲的充滿現代氣息的大樓,武哥心頭一陣激昂。

多少年了?我們武哥終於回來了!回到這個曾經叱吒風雲的戰場,多少次加班?熬夜吹的那些牛逼,曾經一起寫BUG的老夥計們都還好嗎?

想到這裏,武哥眼角有一點溼潤了。

回到現實,打起精神,武哥走進大樓,對着玻璃摸了一把油頭,再次確定他是整個樓最靚的仔後,敲開了面試官的房門。

武哥:(擺出十分老練的樣子)大哥好,我是來面試Java開發崗位的。

面試官:(擡頭掃了武哥一眼,眉頭一皺)你就是武哥?怎麼遲到這麼久?約好早上9點半,你看看現在幾點了?你再不來,我都要去喫午飯了。

武哥:(看出情勢不妙,又擺出憨憨的樣子)額…大哥…是這樣的。早上不是上班高峯嗎?本來路上車多就很堵,恰好我看到一位老奶奶在路邊摔倒了,作爲一個社會三好青年,遇到這樣的事情,我怎麼能不出手相助呢?對不對?然後…

面試官:行了,行了。後面你是不是還救了老奶奶,送了老奶奶去醫院,可是呢,老奶奶倒地不起,就是不去醫院,還賴上你,說是你撞倒了她,要你賠錢。你爲了不耽誤太多時間,只能自己認栽,給了老奶奶200塊錢私了。我說的沒錯吧?

武哥:臥槽?大哥你真神了!你是不是當時也在旁邊看着呢?只不過錢你說錯了,不是200,是500!你說我這是造了什麼孽?

面試官一臉鄙夷看着武哥,搖頭嘆了口氣:哎,你們現在年輕人說起謊來都不能有點創意嗎?你這劇情這周我已經聽到第五個版本了,什麼扶老大爺過馬路,送小妹妹上學,甚至替外賣小哥送外賣的我都聽說過,我可真是長見識了,呵呵…

武哥:(靦腆一笑,想轉移點話題緩解尷尬)那個…大哥,要不咱們開始面試?

面試官:行吧,看你大老遠跑一趟,也不容易,那你簡單自我介紹下吧。

武哥清了清嗓子:啊~ 噢~ 嗯~

面試官有點坐不住了,這人怎麼這麼騷?

武哥向來以臉皮厚著稱,完全不care面試官,開始吹起自己開掛的人生經歷:是這樣的,我17年碩士畢業於同濟大學。先後在 eBay、愛奇藝、華爲、科大訊飛、拼多多踩坑,Java 編程是我自學的,說起我自學Java那段時間,那要從一個月高風黑的夜晚說起…

面試官:(慌忙揮了揮手,心想敢情這貨是個吹牛逼的行家啊,這麼吹下去,我還喫不喫午飯了,還想着喫完搞把農藥睡上一會呢)咱們直接進入正題吧。你面試的是Java,那你知道什麼是類麼?

武哥:老哥你放心,我工作很積極、很實在的,不知道什麼叫累。

面試官:知道什麼是包嗎?

武哥:我平時自己揹包的,不麻煩公司了。

面試官:知道什麼是接口嗎?

武哥:我這個人工作認真。從來不找藉口偷懶的。

面試官:知道什麼是繼承麼?

武哥:我家徒四壁,沒什麼可以繼承的。

面試官:知道什麼叫對象麼?

武哥:(羞射一笑)實不相瞞,我已經結婚了,不搞對象了。

面試官:知道多態麼?

武哥:知道,但是這種事我不會幹的,我最恨的就是不負責任讓自己心愛的人忍受巨大痛苦墮胎的渣男!

面試官:你是猴子請來的逗比嗎?

武哥:不是,我自己開車來的。

面試官:我知道,我是說你是逗比。

武哥:你什麼意思?你這人怎麼罵人呢?

說着武哥紅着臉擼起袖子來,準備大幹一場。

這時面試官站了起來。

武哥看着面前比自己高一個頭的大個兒,心裏一句臥槽,氣勢全丟了。灰溜溜的奪門而逃。

回來後,我問武哥面的咋樣了。

武哥一聲不吭,抱着我就開始放聲痛哭。

我很驚詫,只能摸着武哥的背默默安慰起來…

問了半天才知道武哥面試被打擊了,這時候我偷偷拿出了我珍藏依舊的Java學習指南,翻到面向對象這一章節,開始給武哥講了起來…

乾貨

Java面向對象,有三大特性,下面一個一個細細展開。

封裝

public、private、protected修飾符

說到封裝,Java 中有三個訪問權限修飾符:private、protected 以及 public,如果不加訪問修飾符,表示包級可見。我們先來看下這三個修飾符的作用。

修飾符 當前類 同包 子類 其他包
public
protected ×
default × ×
private × × ×

設計良好的模塊會隱藏所有的實現細節,把它的 API 與它的實現清晰地隔離開來。模塊之間只通過它們的 API 進行通信,一個模塊不需要知道其他模塊的內部工作情況,這個概念被稱爲信息隱藏或封裝。因此訪問權限應當儘可能地使每個類或者成員不被外界訪問。

如果子類的方法重寫了父類的方法,那麼子類中該方法的訪問級別不允許低於父類的訪問級別。這是爲了確保可以使用父類實例的地方都可以使用子類實例去代替,也就是確保滿足里氏替換原則。

規範

字段決不能是公有的,因爲這麼做的話就失去了對這個字段修改行爲的控制,客戶端可以對其隨意修改。例如下面的例子中,AccessExample 擁有 id 公有字段,如果在某個時刻,我們想要使用 int 存儲 id 字段,那麼就需要修改所有的客戶端代碼。

public class AccessExample {
    public String id;
}

可以使用公有的 getter 和 setter 方法來替換公有字段,這樣的話就可以控制對字段的修改行爲。

public class AccessExample {

    private int id;

    public String getId() {
        return id + "";
    }

    public void setId(String id) {
        this.id = Integer.valueOf(id);
    }
}

封裝的好處

  1. 提高數據的安全性。
  2. 操作簡單。
  3. 隱藏了實現。

繼承

繼承是類與類的一種關係,是一種“is a”的關係。比如“狗”繼承“動物”,這裏動物類是狗類的父類或者基類,狗類是動物類的子類或者派生類。如下圖所示:

注:java中的繼承是單繼承,即一個類只有一個父類。

繼承的初始化順序

  1. 初始化父類再初始化子類
  2. 先執行初始化對象中屬性,再執行構造方法中的初始化。

基於上面兩點,我們就知道實例化一個子類,java程序的執行順序是:

父類對象屬性初始化---->父類對象構造方法---->子類對象屬性初始化—>子類對象構造方法

繼承這塊大家都比較熟,我來舉個例子:

繼承示例

Animal動物:

public class Animal {
    /**名稱*/
    public String name;
    /**顏色*/
    public String color;
    
    /**顯示信息*/
    public void show(){
        System.out.println("名稱:"+name+",顏色:"+color);
    }
}

Dog狗:

/**狗繼承自動物,子類 is a 父類*/
public class Dog extends Animal {
    /**價格*/
    public double price;
}

dog並沒有定義color屬性,但在使用中可以調用,是因爲dog繼承了父類Animal,父類的非私有成員將被子類繼承。如果再定義其它的動物類則無須再反覆定義name,color與show方法。

多態

多態這塊,我要跟大家好好嘮叨嘮叨,首先來看下概念:

多態概念

多態:一個對象具備多種形態。
①父類的引用類型變量指向了子類的對象
②接口的引用類型變量指向了接口實現類的對象

多態的前提:必須存在繼承或者實現關係。

動物 a  = new();

多態要注意的細節

  1. 多態情況下,子父類存在同名的成員變量時,訪問的是父類的成員變量。
  2. 多態情況下,子父類存在同名的非靜態的成員函數時,訪問的是子類的成員函數。
  3. 多態情況下,子父類存在同名的靜態的成員函數時,訪問的是父類的成員函數。
  4. 多態情況下,不能訪問子類特有的成員。

總結:多態情況下,子父類存在同名的成員時,訪問的都是父類的成員,除了在同名非靜態函數時纔是訪問子類的。

注意:java編譯器在編譯的時候,會檢查引用類型變量所屬的類是否具備指定的成員,如果不具備馬上編譯報錯。(編譯看左邊)

多態的應用

  1. 多態用於形參類型的時候,可以接收更多類型的數據。
  2. 多態用於返回值類型的時候,可以返回更多類型的數據。

多態的好處: 提高了代碼的拓 展性。

我們想想,平時寫MVC三層模型的時候,service爲什麼要寫接口呢?因爲可能有個service會有多種不同的實現。service就是我們平時用多態最多的地方。


如果覺得有幫助,希望老鐵們來個三連擊,給更多的人看到這篇文章

1、關注我的原創微信公衆號「武哥聊編程」,專注於Java、數據結構和算法、微服務、中間件等技術分享,保證你看完有所收穫。

2、給俺點個贊唄,可以讓更多的人看到這篇文章,順便激勵下我繼續寫作,嘻嘻。

作者info

【作者】:武哥
【公衆號】:武哥聊編程。歡迎大家關注~
【作者簡介】:同濟大學,碩士。先後在華爲、科大訊飛、拼多多采坑。一個自學 Java 的菜鳥,期待你的關注。

點贊是對我最大的鼓勵
↓↓↓↓↓↓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章