面向對象的特徵有什麼?
如果,當人家問到你,這個問題時,我們可以先引申出類的概念, 因爲對象是類的一個實例。
點擊查看類的詳情
後面再去引出面向對象的三大特徵:
- 封裝
- 繼承
- 多態
封裝是什麼?
封裝是面嚮對象語言的精髓。
簡單來講封裝就是,把一些屬性和方法封裝起來,形成一個實體類(JavaBean)或者一個接口(Interface)【可以是方法接口】。
類的屬性,一般是私有的。
類的方法,該公開的公開,該私有的私有。
方法,封裝了實現的過程,接口是參數和返回值。
舉例:1)get/set 方法;對某一個屬性只提供get不提供set方法,就是隻讀的,在類的外部不能修改;2)提供統一的參數檢查,在set上給與檢查,判斷合法性和安全性;將屬性都私有,並且提供set/get 方法,做成了通用的組件,叫JavaBean;
eg: 貓具有如下特性: 可愛,高冷,活潑愛動 那麼,我們可以將其封裝成一個實體類Cat
public class Cat {
private String id;
private String lovely;
private String lively;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getLovely() {
return lovely;
}
public void setLovely(String lovely) {
this.lovely = lovely;
}
public String getLively() {
return lively;
}
public void setLively(String lively) {
this.lively = lively;
}
}
那麼,接口,方法實例來一個。單純表示一個接口方法,至於裏面的實現類並不打算完善
修改:
@RequestMapping("/") //裏面是路徑 url
Integer addOrEdit(@RequestParam("id") String id);//此註解,表示,拿到url上的屬性值
繼承
面向對象的主要功能
繼承是一種構建新類的方式,他是基於已有的類的定義爲基礎,構建新的類,已有的類稱爲父類,新構建的類稱爲子類,子類能調用父類的非private修飾的成員,同時還可以自己添加一些新的成員,擴充父類,甚至重寫父類已有的方法,更其表現符合子類的特徵。讓子類的表現更獨特,更專業。
注意: 子類不能獲得父類中使用privade修飾的成員。以及不可獲得父類的構造器。
打個比喻的話~~那就是,你可以從你父親那邊繼承得到金錢或其它。但你決不能獲得你父親的身體 咳咳咳。
多態
從一定角度來看的話,上面的封裝以及繼承都是爲了多態而準備的。
多態可分爲兩種:
- 編譯時的多態:其實就是方法的重載。
- 運行時的多態:Java運行時,系統根據調用該方法的實例的類型來決定,選擇調用哪個方法。 (其實,我們平時所說的多態大部分便是運行時的多態)
注意:
因爲說了,封裝以及繼承從一定角度來看,就是爲了多態而準備的。
- 一定存在繼承關係。
- 對父類的方法進行了重寫。(重寫是必須存在繼承的,所以有第一點)。
- 調用方法的時候,形參爲父類調用。
點擊此處,查看重載(Overload)以及重寫(Override)
說了這麼多,那麼,多態到底是什麼呢?
簡單來講,多態是同一個行爲具有多個不同表現形式或形態的能力。多態性是對象多種表現形式的體現。
eg:我們在WPS編輯文檔時,F12是保存文檔,但是對於開發人員來講在瀏覽器中F12就是開發工具了,尤其是前端開發人員。可,查看網絡請求,審查元素等等。
抽象
除上之外,抽象也是一個重要的特徵,抽象就是忽略與當前目標無關的相關方面,以便更充分地突出與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。
多態的實現機制是什麼?
Java允許父類或接口定義的引用變量指向子類或具體實現類的實例對象,而程序調用的方法在運行時才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。
正是由於這種機制,兩個相同類型的變量,但由於它們實際引用了不同的方法,所以結果也不同
嘻嘻嘻~是不是有點暈? 表示博主真正的去讀的時候也是這樣,腦殼痛腦殼痛~~
OK,舉個簡單的例子:
就是說,可能多個實例,調用同一方法,那麼,它是怎麼知道該調用那個方法呢?
很簡單,是通過具體的實例調用的,而不是引用變量類型中的定義的方法來運行(如上圖例子:調用Chinese c = new Chinese(); c.eat(); 執行出結果是用筷子吃飯。【不是根據引用變量類型中的定義的方法運行,是指不是看左邊的 Chinese c 的引用變量,而是看右邊的具體事例去調用方法,如果把右邊的換成new Indian() ;那麼調用eat();方法運行的結果又是不同 】
)。【所謂引用變量(如: China C = new China 引用變量是C 而 引用變量類型是China)】
看完之後,是不是有點理解了~~~機智如你,對吧
最後,來個多態例子:
結果