業內常常說的一句話是不要重複造輪子,可是有時候,只有本身造一個輪子了,纔會深入明白什麼樣的輪子適合山路,什麼樣的輪子適合平地!html
我將會持續更新java基礎知識,歡迎關注。java
往期章節:面試
至今記得若干年前,去面試排了半天的隊,到個人時候,面試官問個人第一個問題,java三大特性是什麼~我支支吾吾的沒有答全~0.0post
什麼是封裝?this
舉個例子:有一個房子,房子裏面有廚房,衛生間,臥室,客廳等房間,每個房間都有各自的用途,而客人要來我家吃飯也好,閒聊也好,那麼他只能從我家的門(對外暴露的接口)進來,那這個房子就表明一個「封裝」。url
封裝(Encapsulation)是面向對象方法的重要原則,就是把對象的屬性和操做(或服務)結合爲一個獨立的總體,並儘量隱藏對象的內部實現細節。spa
封裝時的權限控制符區別以下:code
具體到java代碼以下:htm
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 }
文中如有不正之處,歡迎批評指正!