抽象類,顧名思義,即類的抽象。
在介紹面向對象概念時,我們知道類是客觀事物的抽象,而抽象類又是類的進一步抽象,該怎麼理解呢?
舉個例子,我們定義若干個類 class BMW
、class Benz
、class Audi
,分別對客觀事物“寶馬”、“奔馳”、“奧迪”三種汽車進行抽象,包含相關屬性和行爲(即方法)。但是我們知道,汽車都有通用的屬性和行爲,比如品牌、發動機、方向盤、輪胎等屬性,前進、後退、轉彎等行爲,所以我們可以在寶馬、奔馳等汽車之上,進一步抽象出“汽車”類 abstract class Car
,包含通用的特性(屬性和方法)。讓 BMW、Benz、Audi 等繼承抽象類 extends Car
,便擁有了汽車的通用特性,然後在抽象類基礎上定義各自的特殊屬性及方法。
這裏的 abstract class Car
即抽象類,可以看出,抽象類是用來捕捉子類的通用特性的,包括屬性及行爲。
實例:
定義一個抽象動物類Animal,提供抽象方法叫cry(),貓、狗都是動物類的子類,由於cry()爲抽象方法,所以Cat、Dog必須要實現cry()方法。如下:
public abstract class Animal {
public abstract void cry();
}
public class Cat extends Animal{
@Override
public void cry() {
System.out.println("貓叫:喵喵...");
}
}
public class Dog extends Animal{
@Override
public void cry() {
System.out.println("狗叫:汪汪...");
}
}
public class Test {
public static void main(String[] args) {
Animal a1 = new Cat();
Animal a2 = new Dog();
a1.cry();
a2.cry();
}
}
--------------------------------------------------------------------
Output:
貓叫:喵喵...
狗叫:汪汪...
在使用抽象類時需要注意幾點:
- 抽象類不能被實例化,實例化的工作應該交由它的子類來完成,它只需要有一個引用即可。
- 抽象方法必須由子類來進行重寫。
- 只要包含一個抽象方法的抽象類,該方法必須要定義成抽象類,不管是否還包含有其他方法。
- 抽象類中可以包含具體的方法,當然也可以不包含抽象方法。
- 子類中的抽象方法不能與父類的抽象方法同名。
- abstract不能與final並列修飾同一個類。
- abstract 不能與private. static. final或native並列修飾同一個方法。
創建抽象類和抽象方法非常有用,因爲他們可以使類的抽象性明確起來,並告訴用戶和編譯器打算怎樣使用他們.抽象類還是有用的重構器,因爲它們使我們可以很容易地將公共方法沿着繼承層次結構向上移動。(From:Think in java )
參考 :
- https://blog.csdn.net/chenssy/article/details/12858267
- https://juejin.im/post/5c0d4859e51d4504a02eb6e2