Java的抽象類詳解
一、抽象類概述
舉一個貓狗案例,提取出了一個動物類。但只有看到了具體的動物,我們才知道,這是什麼動物。 所以說,動物本身並不是一個具體的事物,而是一個抽象的事物。只有真正的貓、狗才是具體的動物。同理,我們也可以推想,不同的動物吃的東西應該是不一樣的,所以,我們不應該在動物類中給出具體體現,而是應該給出一個宣告即可。
把多個共性的東西提取到一個類中,這是繼承的做法。但是,這多個共性的東西在有些時候,方法宣告一樣,但是方法體(每個具體的物件在具體實現時候的內容)不一樣。所以,我們在定義這些共性的方法的時候,就不能給出具體的方法體。而一個沒有具體的方法體的方法是抽象的方法。
在Java中,一個沒有方法體的方法應該定義為抽象方法,而類中如果有抽象方法,該類必須定義為抽象類。
二、抽象類特點
1、抽象類和抽象方法必須用abstract關鍵字修飾
格式:
abstract class 類名 {}
public abstract void eat();
2、抽象類不一定有抽象方法,有抽象方法的類一定是抽象類
3、抽象類不能例項化
如果想例項化,應按照多型的方式,由具體的子類例項化。其實這也是多型的一種,抽象類多型。
4、抽象類的子類
可以是一個抽象類;
可以是一個具體類,但需要重寫抽象類中的所有抽象方法。
三、抽象類的成員特點
1、成員變數
可以是變數
也可以是常量
2、構造方法
有構造方法,但是不能例項化。所以構造方法存在的作用是用於子類訪問父類資料的初始化
3、成員方法
可以有抽象方法,限定子類必須完成某些動作
也可以有非抽象方法,提高程式碼複用性
四、需要注意幾個問題
1、一個類如果沒有抽象方法,可不可以定義為抽象類?如果可以,有什麼意義?
可以定義為抽象類,為了不讓建立物件。
2、abstract不能和哪些關鍵字共存?
private衝突
final衝突
static無意義
五、例項說明
/* 動物不應該定義為具體的東西,而且動物中的吃,睡等也不應該是具體的。 我們把一個不是具體的功能稱為抽象的功能,而一個類中如果有抽象的功能,該類必須是抽象類。 抽象類的例項化其實是靠具體的子類實現的。是多型的方式。 Animal a = new Cat(); */ //抽象類的宣告格式 abstract class Animal { private String name; private int age; public Animal(){} public Animal(String name,int age){ this.name = name; this.age = age; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } //抽象方法 //public abstract void eat(){} //空方法體,這個會報錯。抽象方法不能有主體 public abstract void eat(); } //子類是抽象類 abstract class Dog extends Animal {} //子類是具體類,重寫抽象方法 class Cat extends Animal { public Catt(){} public Catt(String name,int age){ super(name, age); } public void eat() { System.out.println("貓吃魚"); } } class AbstractDemo { public static void main(String[] args) { //建立物件 //Animal a = new Animal();//錯誤,Animal是抽象的; 無法例項化 //通過多型的方式 Animal a = new Cat(); a.eat(); } }