JAVA基礎第三章-類與對象、抽象類、接口 JAVA基礎第一章-初識java JAVA基礎第二章-java三大特性:封裝、繼承、多態

 業內常常說的一句話是不要重複造輪子,可是有時候,只有本身造一個輪子了,纔會深入明白什麼樣的輪子適合山路,什麼樣的輪子適合平地!html

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

 

往期章節:面試

JAVA基礎第一章-初識java編程

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接口)和數據共享(裏面的變量全是常量)的做用;

抽象類和接口相同點:

都不能被實例化;

均可以定義靜態常量;

 

 

 


 

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

相關文章
相關標籤/搜索