溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java三大特性:封裝、繼承、多態(tài)

發(fā)布時間:2020-07-10 18:06:08 來源:網(wǎng)絡(luò) 閱讀:554 作者:沙漏半杯 欄目:編程語言

至今記得若干年前,去面試排了半天的隊,到我的時候,面試官問我的第一個問題,java三大特性是什么~我支支吾吾的沒有答全~0.0


什么是封裝?


舉個例子:有一個房子,房子里面有廚房,衛(wèi)生間,臥室,客廳等房間,每一個房間都有各自的用途,而客人要來我家吃飯也好,閑聊也好,那么他只能從我家的門(對外暴露的接口)進(jìn)來,那這個房子就代表一個“封裝”。


封裝(Encapsulation)是面向?qū)ο蠓椒ǖ闹匾瓌t,就是把對象的屬性和操作(或服務(wù))結(jié)合為一個獨立的整體,并盡可能隱藏對象的內(nèi)部實現(xiàn)細(xì)節(jié)。


封裝時的權(quán)限控制符區(qū)別如下:




具體到j(luò)ava代碼如下:


/*


* 封裝演示


*/


public class House


{


// 私有化屬性


private String cookroom;


private String bathroom;


private String bedroom;


private String parlor;


public String getCookroom() {


return cookroom;


}


public void setCookroom(String cookroom) {


this.cookroom = cookroom;


}


public String getBathroom() {


return bathroom;


}


public void setBathroom(String bathroom) {


this.bathroom = bathroom;


}


public String getBedroom() {


return bedroom;


}


public void setBedroom(String bedroom) {


this.bedroom = bedroom;


}


public String getParlor() {


return parlor;


}


public void setParlor(String parlor) {


this.parlor = parlor;


}


}


所以,在這里我們可以看到這個House 類就是一個封裝的體現(xiàn)。


什么是繼承?


俗話說,龍生龍,鳳生鳳,老鼠的兒子會打洞,這就是繼承的一種表現(xiàn)。就像我們每個人會繼承父母的相貌等基因,甚至財富,人脈等資源。


同樣在java代碼中類與類,接口與接口之間都存在繼承,要想繼承另一個類,那么 extends 是必不可少的。


唯一要注意的是,java所倡導(dǎo)的繼承是單繼承,就像我們每一個人,只會有一個親生父親(當(dāng)然馬云爸爸,要認(rèn)我做兒子的話,我也是無法拒絕的0.0),所以java類只能通過關(guān)鍵字extends 繼承另外一個類,或者一個接口通過 關(guān)鍵字extends繼承另外一個接口。


而類與接口之間,只能是類實現(xiàn)接口,通過關(guān)鍵字 implements 完成類實現(xiàn)接口。


具體java代碼如下:


1 public class MyHouse extends House{2 //我的房子啥都沒有~3 4 }


從上面代碼看到,新建MyHouse類啥都沒有,我只是繼承了House,但是請看下圖,我可以通過new一個MyHouse對象去調(diào)用House的方法屬性,這就是繼承的魅力




最后還要強調(diào)的一點就是繼承和 final 關(guān)鍵字的關(guān)系:


final 可以修飾類,代表當(dāng)前被修飾類不能被繼承;


可以修飾變量,就變成了類的常量,這個變量一旦被初始化便不可改變;


可以修飾方法,代表子類不能復(fù)寫或者說不能改變被修飾的方法中的代碼,但是可以直接拿來使用;


注:萬物皆對象,其實我們每新建一個類,都是已經(jīng)默認(rèn)繼承了Object類了,我們新建一個類之后,可以看到有一些默認(rèn)的方法,如下圖中我圈中的部分,都是來自于Object類的。




什么是多態(tài)?


java中的多態(tài)具體分為2大類:覆寫(又叫重寫)和重載


覆寫


覆寫的存在的前提條件就是首先要有繼承,比如前面我們寫的Myhouse繼承House,我在House類中新增一個方法名為myName,之前的代碼不做變化,新增代碼如下:


1 public String myName()2 {3 return"House";4 }


這個時候我通過Myhouse對象調(diào)用myName方法,通過輸出到控制臺可以看到,輸出的結(jié)果為house,因為我們繼承了父類




下面我們在子類中覆寫這個方法,代碼如下


public class MyHouse extends House{


public static void main(String[] args) {


MyHouse mm = new MyHouse();


System.out.println(mm.myName());


}


public String myName()


{


return "myHouse";


}


}


這個時候再運行程序,得到的結(jié)果就是 myHouse,而不再是House。


所以呢,覆寫就是當(dāng)子類定義了和父類在方法名稱、返回值類型、參數(shù)類型及個數(shù)完全相同的方法的時候,稱為方法的覆寫。


在進(jìn)行方法覆寫的時候有一點需要注意:被子類所覆寫的方法不能擁有比父類更嚴(yán)格的訪問控制權(quán)限。


如果此時父類之中的方法是default權(quán)限,那么子類覆寫的時候只能是default或public權(quán)限,而如果父類的方法是public,那么子類之中方法的訪問權(quán)限只能是public。


當(dāng)一個子類覆寫了一個父類方法的時候,子類要想調(diào)用父類的被覆寫過的方法,要在方法前要加上 super 關(guān)鍵字


重載


重載,簡單說,就是函數(shù)或者方法有相同的名稱,但是參數(shù)列表不相同的情形,這樣的同名不同參數(shù)的函數(shù)或者方法之間,互相稱之為重載函數(shù)或者方法。


關(guān)于重載是不是多態(tài)這部分,其實有很多人還進(jìn)行過爭論,有人認(rèn)為他不是面向?qū)ο螅皇敲嫦蚍椒?,違背了最基本要求。


我個人理解,重載是不是多態(tài) 關(guān)鍵是你給多態(tài)的定義是什么 如果多態(tài)的定義是同一事物具有的不同反應(yīng) 那重載也算多態(tài) 也就是所謂的廣義多態(tài) 。


具體的代碼表現(xiàn)如下,同名的myName方法有4個,在調(diào)用的時候我們只需要傳入不同的參數(shù)即可調(diào)用相應(yīng)的方法:


public class MyHouse extends House{


public static void main(String[] args) {


MyHouse mm = new MyHouse();


System.out.println(mm.myName());


}


public String myName()


{


return "myHouse";


}


public String myName(String args)


{


return "myHouse" + args;


}


public String myName(String args,String args1)


{


return "myHouse" + args;


}


public String myName(int i)


{


return "myHouse" + i;


}


}


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI