Java抽象類概念
在面向對象的概念中,所有的對象都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
抽象類除了不能實例化對象之外,類的其它功能依然存在,成員變量、成員方法和構造方法的訪問方式和普通類一樣。
由於抽象類不能實例化對象,所以抽象類必須被繼承,才能被使用。也是因爲這個原因,通常在設計階段決定要不要設計抽象類。
父類包含了子類集合的常見的方法,但是由於父類本身是抽象的,所以不能使用這些方法。
在Java中抽象類表示的是一種繼承關係,一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。
抽象類
在Java語言中使用abstract class來定義抽象類。如下實例:
People.java文件
package com; /** * @author HeLiu * @Description 人抽象類(Java語言中使用abstract class來定義抽象類) * @date 2018/11/9 10:31 */ public abstract class People { private String name; private Integer age; private String sex; public People(String name, Integer age, String sex) { System.out.println("Constructing an People"); this.name = name; this.age = age; this.sex = sex; } public void smile() { System.out.println("ha...ha...ha..."); } public void said() { System.out.println("My name is " + name + ",I am " + age + " years old."); } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String toString() { return "people:[" + name + "," + age + "," + sex + "]"; } }
注意到該People類沒有什麼不同,儘管該類是抽象類,但是它仍然有3個成員變量,9個成員方法和1個構造方法。 現在如果你嘗試如下的例子:
AbstractDemo.java文件package com; /** * @author HeLiu * @Description 抽象類測試 * @date 2018/11/9 10:55 */ public class AbstractDemo { public static void main(String[] args) { //這裏會直接報錯,是不被允許的 java: com.People是抽象的; 無法實例化 People people = new People("Lary", 18, "女"); System.out.println("Introduce yourself with a smile."); people.smile(); people.said(); } }
當你嘗試運行main方法的時候回報這樣的錯誤:
People是抽象的; 無法實例化
繼承抽象類
通過繼承People
Lary.java文件
package com; /** * @author HeLiu * @Description 繼承People * @date 2018/11/9 11:47 */ public class Lary extends People { public Lary(String name, Integer age, String sex) { super(name, age, sex); } }
儘管我們不能實例化一個People類的對象,但是如果我們實例化一個Lary類對象,該對象將從People類繼承成員方法,且通過該方法可以設置或獲取成員變量。
AbstractDemo.java文件
package com; /** * @author HeLiu * @Description 抽象類測試 * @date 2018/11/9 10:55 */ public class AbstractDemo { public static void main(String[] args) { Lary lary = new Lary("Lary", 18, "女"); System.out.println("Introduce yourself with a smile."); lary.smile(); lary.said(); System.out.println("-------------------------------------------"); People people = new Lary("Join", 16, "男"); System.out.println("Introduce yourself with a smile."); people.smile(); people.said(); } }
運行結果:
抽象方法
如果你想設計這樣一個類,該類包含一個特別的成員方法,該方法的具體實現由它的子類確定,那麼你可以在父類中聲明該方法爲抽象方法。
Abstract關鍵字同樣可以用來聲明抽象方法,抽象方法只包含一個方法名,而沒有方法體。
抽象方法沒有定義,方法名後面直接跟一個分號,而不是花括號。
public abstract class People { private String name; private Integer age; private String sex; //抽象方法 public abstract String ownName(); //其餘代碼 }
聲明抽象方法會造成以下兩個結果:
- 如果一個類包含抽象方法,那麼該類必須是抽象類。
- 任何子類必須重寫父類的抽象方法,或者聲明自身爲抽象類。
繼承抽象方法的子類必須重寫該方法。否則,該子類也必須聲明爲抽象類。最終,必須有子類實現該抽象方法,否則,從最初的父類到最終的子類都不能用來實例化對象。
如果Lary類繼承了People類,那麼它必須實現ownName()方法:
public class Lary extends People { public Lary(String name, Integer age, String sex) { super(name, age, sex); } @Override 這行可以去掉 public String ownName() { //這裏面的業務邏輯代碼可以按照你的實際需求編寫 } //其餘代碼 }
抽象類總結規定
-
1. 抽象類不能被實例化(初學者很容易犯的錯),如果被實例化,就會報錯,編譯無法通過。只有抽象類的非抽象子類可以創建對象。
-
2. 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
-
3. 抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實現也就是方法的具體功能。
-
4. 構造方法,類方法(用static修飾的方法)不能聲明爲抽象方法。
-
5. 抽象類的子類必須給出抽象類中的抽象方法的具體實現,除非該子類也是抽象類。