1. 程式人生 > >JAVA基礎第三章-類與物件、抽象類、介面 JAVA基礎第一章-初識java JAVA基礎第二章-java三大特性:封裝、繼承、多型

JAVA基礎第三章-類與物件、抽象類、介面 JAVA基礎第一章-初識java JAVA基礎第二章-java三大特性:封裝、繼承、多型

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

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

 

往期章節:

JAVA基礎第一章-初識java

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

 


 

類與物件

什麼是類?

類是抽象的概念集合,表示的是一個共性的產物,類之中定義的是屬性和行為(方法)。

什麼是物件?

物件是一種個性的表示,表示一個獨立的個體,每個物件擁有自己獨立的屬性,依靠屬性來區分不同物件。

所以總結來說的話,類是物件的模板,物件是類的例項

舉個例子:

人類就是一個類(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介面)和資料共享(裡面的變數全是常量)的作用;

抽象類和介面相同點:

都不能被例項化;

都可以定義靜態常量;

 

 

 


 

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