1. 程式人生 > >java三大特性:封裝、繼承、多型

java三大特性:封裝、繼承、多型

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

什麼是封裝?

舉個例子:有一個房子,房子裡面有廚房,衛生間,臥室,客廳等房間,每一個房間都有各自的用途,而客人要來我家吃飯也好,閒聊也好,那麼他只能從我家的門(對外暴露的介面)進來,那這個房子就代表一個“封裝”。

封裝(Encapsulation)是面向物件方法的重要原則,就是把物件的屬性和操作(或服務)結合為一個獨立的整體,並儘可能隱藏物件的內部實現細節。

封裝時的許可權控制符區別如下:
java三大特性:封裝、繼承、多型
具體到java程式碼如下:

/*

  • 封裝演示

*/

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 類就是一個封裝的體現。

什麼是繼承?

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

同樣在java程式碼中類與類,介面與介面之間都存在繼承,要想繼承另一個類,那麼 extends 是必不可少的。

唯一要注意的是,java所倡導的繼承是單繼承,就像我們每一個人,只會有一個親生父親(當然馬雲爸爸,要認我做兒子的話,我也是無法拒絕的0.0),所以java類只能通過關鍵字extends 繼承另外一個類,或者一個介面通過 關鍵字extends繼承另外一個介面。

而類與介面之間,只能是類實現介面,通過關鍵字 implements 完成類實現介面。

具體java程式碼如下:

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

從上面程式碼看到,新建MyHouse類啥都沒有,我只是繼承了House,但是請看下圖,我可以通過new一個MyHouse物件去呼叫House的方法屬性,這就是繼承的魅力
java三大特性:封裝、繼承、多型

最後還要強調的一點就是繼承和 final 關鍵字的關係:

final 可以修飾類,代表當前被修飾類不能被繼承;

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

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

注:萬物皆物件,其實我們每新建一個類,都是已經預設繼承了Object類了,我們新建一個類之後,可以看到有一些預設的方法,如下圖中我圈中的部分,都是來自於Object類的。

java三大特性:封裝、繼承、多型
什麼是多型?

java中的多型具體分為2大類:覆寫(又叫重寫)和過載

覆寫

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

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

這個時候我通過Myhouse物件呼叫myName方法,通過輸出到控制檯可以看到,輸出的結果為house,因為我們繼承了父類
java三大特性:封裝、繼承、多型
下面我們在子類中覆寫這個方法,程式碼如下

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";

}

}

這個時候再執行程式,得到的結果就是 myHouse,而不再是House。

所以呢,覆寫就是當子類定義了和父類在方法名稱、返回值型別、引數型別及個數完全相同的方法的時候,稱為方法的覆寫。

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

如果此時父類之中的方法是default許可權,那麼子類覆寫的時候只能是default或public許可權,而如果父類的方法是public,那麼子類之中方法的訪問許可權只能是public。

當一個子類覆寫了一個父類方法的時候,子類要想呼叫父類的被覆寫過的方法,要在方法前要加上 super 關鍵字

過載

過載,簡單說,就是函式或者方法有相同的名稱,但是引數列表不相同的情形,這樣的同名不同引數的函式或者方法之間,互相稱之為過載函式或者方法。

關於過載是不是多型這部分,其實有很多人還進行過爭論,有人認為他不是面向物件,只是面向方法,違背了最基本要求。

我個人理解,過載是不是多型 關鍵是你給多型的定義是什麼 如果多型的定義是同一事物具有的不同反應 那過載也算多型 也就是所謂的廣義多型 。

具體的程式碼表現如下,同名的myName方法有4個,在呼叫的時候我們只需要傳入不同的引數即可呼叫相應的方法:

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;

}

}

若有不正確之處,歡迎批評指正!