JAVA基礎第二章-java三大特性:封裝、繼承、多態


業內經常說的一句話是不要重復造輪子,但是有時候,只有自己造一個輪子了,才會深刻明白什么樣的輪子適合山路,什么樣的輪子適合平地!

我將會持續更新java基礎知識,歡迎關注。

 

往期章節:

JAVA基礎第一章-初識java

 

 

 

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

什么是封裝?

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

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

封裝時的權限控制符區別如下:

 

具體到java代碼如下:

 1  /*
 2   * 封裝演示
 3    */
 4  public class House 
 5 {
 6     
 7      // 私有化屬性
 8      private String cookroom;
 9      private String bathroom;
10      private String bedroom;
11      private String parlor;
12      
13     public String getCookroom() {
14         return cookroom;
15     }
16     public void setCookroom(String cookroom) {
17         this.cookroom = cookroom;
18     }
19     public String getBathroom() {
20         return bathroom;
21     }
22     public void setBathroom(String bathroom) {
23         this.bathroom = bathroom;
24     }
25     public String getBedroom() {
26         return bedroom;
27     }
28     public void setBedroom(String bedroom) {
29         this.bedroom = bedroom;
30     }
31     public String getParlor() {
32         return parlor;
33     }
34     public void setParlor(String parlor) {
35         this.parlor = parlor;
36     }
37 }

所以,在這里我們可以看到這個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的方法屬性,這就是繼承的魅力

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

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

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

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

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

 

什么是多態?

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

覆寫

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

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

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

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

 1 public class MyHouse extends House{
 2 
 3     public static void main(String[] args) {
 4         
 5         MyHouse mm = new MyHouse();
 6         System.out.println(mm.myName());
 7     }
 8     public String myName()
 9     {
10         return "myHouse";
11     }
12 }

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

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

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

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

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

 

重載

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

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

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

具體的代碼表現如下,同名的myName方法有4個,在調用的時候我們只需要傳入不同的參數即可調用相應的方法:

 1 public class MyHouse extends House{
 2 
 3     public static void main(String[] args) {
 4         
 5         MyHouse mm = new MyHouse();
 6         System.out.println(mm.myName());
 7     }
 8     public String myName()
 9     {
10         return "myHouse";
11     }
12     
13     public String myName(String args)
14     {
15         return "myHouse" + args;
16     }
17     
18     public String myName(String args,String args1)
19     {
20         return "myHouse" + args;
21     }
22     
23     public String myName(int i)
24     {
25         
26         return "myHouse" + i;
27     }
28 }

 

 

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM