業內常常說的一句話是不要重複造輪子,可是有時候,只有本身造一個輪子了,纔會深入明白什麼樣的輪子適合山路,什麼樣的輪子適合平地!html
我將會持續更新java基礎知識,歡迎關注。java
往期章節:面試
類與對象函數
什麼是類?post
類是抽象的概念集合,表示的是一個共性的產物,類之中定義的是屬性和行爲(方法)。this
什麼是對象?url
對象是一種個性的表示,表示一個獨立的個體,每一個對象擁有本身獨立的屬性,依靠屬性來區分不一樣對象。spa
因此總結來講的話,類是對象的模板,對象是類的實例。
舉個例子:
人類就是一個類(class),你,我,他就是每個人類的實例。咱們每個個體的最基本的屬性有姓名、性別、體重、身高等。
具體的代碼表現以下:
1 public class Human 2 { 3 private String name; 4 private String sex; 5 private int weight; 6 private int heiht; 7 8 9 public static void main(String[] args) 10 { 11 Human me = new Human(); 12 me.setName("JJ"); 13 me.setSex("man"); 14 me.setHeiht(198); //個人理想身高~0.0 15 me.setWeight(180); 16 17 Human he = new Human(); 18 he.setName("name"); 19 he.setSex("man"); 20 he.setHeiht(180); 21 he.setWeight(150); 22 } 23 24 25 public String getName() { 26 return name; 27 } 28 29 public void setName(String name) { 30 this.name = name; 31 } 32 33 public String getSex() { 34 return sex; 35 } 36 37 public void setSex(String sex) { 38 this.sex = sex; 39 } 40 41 public int getWeight() { 42 return weight; 43 } 44 45 public void setWeight(int weight) { 46 this.weight = weight; 47 } 48 49 public int getHeiht() { 50 return heiht; 51 } 52 53 public void setHeiht(int heiht) { 54 this.heiht = heiht; 55 } 56 }
從上面的代碼咱們能夠看到,在main函數中,咱們經過 new 關鍵字新建了2個對象。一個是me,一個是he,咱們都來自Human類,可是咱們具備不一樣的屬性,咱們除了性別相同,其餘的屬性徹底不一樣。
這裏特別再提到一點就是咱們在 new 一個對象的時候後面的 Human() 函數,咱們稱之爲構造函數(方法)。
在建立一個對象的時候,至少要調用一個構造方法。構造方法的名稱必須與類同名,一個類能夠有多個構造方法。
每一個類都有構造函數。若是沒有顯式地爲類定義構造方法,Java編譯器將會爲該類提供一個默認構造方法。因此從上面代碼能夠看到,咱們並無指定構造函數,而是採用了默認的。
多個構造函數的寫法,代碼表現以下:
1 //每次新建的時候直接先設置性別,那麼當前新建的對象就不用再設置性別屬性 2 public Human(String sex) 3 { 4 this.sex = sex; 5 } 6 7 //這個構造函數和默認構造函數相同,不傳任何參數 8 public Human() 9 { 10 11 }
若是咱們沒有聲明構造函數,那麼編譯器會爲咱們提供一個默認無參的構造函數;若是咱們聲明瞭構造函數,無論幾個,那麼編譯器就再也不爲咱們提供默認的構造函數。
抽象類
使用了關鍵詞 abstract 聲明的類叫做「抽象類」。若是一個類裏包含了一個或多個抽象方法,類就必須指定成abstract(抽象)。「抽象方法」,屬於一種不完整的方法,只含有一個聲明,沒有方法主體。
具體代碼表現以下:
1 public abstract class Human 2 { 3 private String name; 4 private String sex; 5 private int weight; 6 private int heiht; 7 8 public abstract String sayHello(); 9 10 public String getName() { 11 return name; 12 } 13 14 public void setName(String name) { 15 this.name = name; 16 } 17 18 public String getSex() { 19 return sex; 20 } 21 22 public void setSex(String sex) { 23 this.sex = sex; 24 } 25 26 public int getWeight() { 27 return weight; 28 } 29 30 public void setWeight(int weight) { 31 this.weight = weight; 32 } 33 34 public int getHeiht() { 35 return heiht; 36 } 37 38 public void setHeiht(int heiht) { 39 this.heiht = heiht; 40 } 41 }
從上面的代碼中咱們能夠看到類名稱前面添加了abstract 關鍵字,抽象方法sayHello 前面也添加了關鍵字abstract, 同時這個方法不能寫方法體。
包含抽象方法的類稱爲抽象類,但並不意味着抽象類中只能有抽象方法,它和普通類同樣,一樣能夠擁有成員變量和普通的成員方法。
抽象類和普通類的主要一些區別:
抽象方法權限必須爲public或者protected,由於若是爲private,則不能被子類繼承,子類便沒法實現該方法,缺省狀況下默認爲public。
抽象類不能建立對象,也就是不能經過new實例化;
若是一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。
若是子類沒有實現父類的抽象方法,則必須將子類也定義爲爲abstract類。
在其餘方面,抽象類和普通的類並無區別。
接口
提及接口,那麼不少時候咱們就會和抽象類相比較,並且這個問題也是不少初級javaer,常常會被問到的面試問題。
接口(英文:Interface):在JAVA編程語言中是一個抽象類型,是抽象方法的集合,接口一般以 interface 來聲明。一個類經過繼承(實現)接口的方式,從而來繼承接口的抽象方法。
具體的代碼表現以下:
1 /** 2 * 動物接口 3 * @author JJJ 4 * 5 */ 6 public interface Animals 7 { 8 //接口內的靜態成員常量 9 static String eyes = "1"; 10 static final String leg = "2"; 11 //吃東西 12 public void eatFood(); 13 }
在上面咱們已經制定了一個 Animals 接口,而人類做爲高級動物,必然也是須要吃東西,下面咱們就讓人類實現 Animals 接口,具體代碼以下:
1 public class Human implements Animals 2 { 3 private String name; 4 private String sex; 5 private int weight; 6 private int heiht; 7 public String getName() { 8 return name; 9 } 10 11 public void setName(String name) { 12 this.name = name; 13 } 14 15 public String getSex() { 16 return sex; 17 } 18 19 public void setSex(String sex) { 20 this.sex = sex; 21 } 22 23 public int getWeight() { 24 return weight; 25 } 26 27 public void setWeight(int weight) { 28 this.weight = weight; 29 } 30 31 public int getHeiht() { 32 return heiht; 33 } 34 35 public void setHeiht(int heiht) { 36 this.heiht = heiht; 37 } 38 39 public String eatFood() 40 { 41 return "今天我吃了米飯!"; 42 } 43 }
看上面的代碼第39行~咱們從新實現了接口中的 eatFood 方法,而且寫上了方法體。
另外在這裏要說明一下,在 Animals 接口中咱們聲明瞭2個靜態的成員變量eyes和 leg,後者被 final 修飾,在上一章節中咱們說過凡是被 final 修飾的一旦初始化,就不能夠更改。
那麼 eyes 是否是就能夠修改呢?
從上圖能夠看出,答案是不行~即便你在聲明的時候沒有顯示的寫 final ,在接口中依然會把這個變量歸爲常量,因此接口中的屬性必然是常量,只能讀不能改,這樣才能爲實現接口的對象提供一個統一的屬性。
抽象類與接口的區別:
接口是公開的,裏面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是能夠有私有方法或私有變量的,另外,實現接口的必定要實現接口裏定義的全部方法,而實現抽象類能夠有選擇地重寫須要用到的方法;
通常的應用程序中,最頂級的是接口,而後是抽象類實現接口,最後纔到具體類實現;
一個類只能繼承一個父類,但能夠經過繼承(實現)多個接口實現多重繼承,接口還有標識(裏面沒有任何方法,如序列化 java.io.Serializable接口)和數據共享(裏面的變量全是常量)的做用;
抽象類和接口相同點:
都不能被實例化;
均可以定義靜態常量;
文中如有不正之處,歡迎批評指正!