Java中的抽象類與abstract 關鍵字使用詳解
一、抽象類的概念
如果一個類不能明確地表示一個具體的對象(即沒有包含足夠的信息來描述具體的對象),那么可以將該類設計為抽象類。因為不能明確表示一個對象,當然也不能實例化抽象類。
比如圖形、動物、昆蟲等就是抽象類。本文將以圖形為例進行講解。
圓形、三角形、矩形都是圖形,因此它們與圖形的關系是繼承關系。圖形 Shape 可以被繪制,因此可以定義一個 draw() 方法,但因為 Shape 無法具體被繪制成什么形狀,因此 draw() 方法也是一個抽象方法,無法具體實現(xiàn)。
二、使用 abstract
2.1 修飾類 => 抽象類
public sbatract class Shape{ }2.2 修飾方法 => 抽象方法,沒有具體的實現(xiàn)
public abstract void draw();
2.3 注意事項
(1)抽象方法和抽象類之間的關系:
抽象方法必須在抽象類中,不能在普通的類當中。說白了就是,一個類中有抽象方法,那么這個類必須是抽象類。
但抽象類不是必須包含抽象方法。

(2)抽象類和普通類的區(qū)別:
兩者都是類,但是抽象類可以包含抽象方法,也可以包含普通方法和屬性,甚至構(gòu)造方法,而普通類不能包含抽象方法。
public abstract class Shape {
public String name;
public void create(){
}
public abstract void draw();
}(3)抽象類不能直接實例化對象

(4)抽象方法不能使用 private 修飾符;
(5)抽象方法不能被 final 和 static 修飾,因為抽象方法要被子類重寫;
(6)抽象類必須被繼承,并且繼承后子類要重寫父類中的抽象方法;否則子類也是抽象類,必須要使用 abstract 修飾;
(7)抽象類中可以有構(gòu)造方法,供子類創(chuàng)建對象時,初始化父類的成員變量。
三、抽象類的作用
抽象類本身不能被實例化,要想使用,只能創(chuàng)建該抽象類的子類,然后讓子類重寫抽象類中的抽象方法。
?既然那么麻煩,為什么不直接用普通類呢?
因為 抽象類比普通類多了一層編譯器自動檢驗機制:
如果抽象類中包含了抽象方法,另一個普通類繼承了這個抽象類,那么編譯器會自動檢測該普通類中是否有抽象方法的重寫。

public class Cycle extends Shape{
@Override
public void draw() {
System.out.println("畫一個圓形。");
}
}但抽象類不能實例化,那抽象類的作用是什么?
抽象類的存在就是為了被繼承的,其定義的成員變量和方法可以給子類使用。即,也可以向上轉(zhuǎn)型、發(fā)生動態(tài)綁定。
public class Flower extends Shape{
@Override
public void draw() {
System.out.println("畫一朵花。");
}
}
使用方法1:Shape 抽象類類型的數(shù)組,與普通類使用方法一致
public class Test {
public static void main(String[] args) {
Cycle cycle = new Cycle();
Flower flower = new Flower();
Shape[] shapes = {cycle,flower,cycle,flower};
for (Shape s : shapes){
s.draw();
}
}
}使用方法2:向上轉(zhuǎn)型
public class Test {
public static void main(String[] args) {
//Shape shape = new Shape(); // 不行
Shape shape = new Cycle(); // 可以,向上轉(zhuǎn)型
}
}
四、多層繼承抽象類
如果抽象類涉及多層繼承,在普通類中有多少抽象方法就得重寫多少個。
public abstract class Shape {
public abstract void draw();
}
abstract class SolidShape extends Shape{ // 立體圖形
abstract void test();
}
class Cylinder extends SolidShape{ // 柱體
@Override
void test() {
}
@Override
public void draw() {
}
}五、匿名對象
一般實例化對象的語句都是形如 Dog dog = new Dog(); ,如果去掉等號左邊,得到的 new Dog() 就是匿名對象。
public class Test {
public static void drawMap(Shape shape){
shape.draw();
}
public static void main(String[] args) {
drawMap(new Cycle()); // 傳的參數(shù)是匿名對象
drawMap(new Flower());
}
}匿名對象的缺點是只能使用一次,
public class Test {
public static void drawMap(Shape shape){
shape.draw();
}
public static void main(String[] args) {
Cycle cycle = new Cycle();
drawMap(cycle);
drawMap(cycle); // 只用實例化一個對象,傳的是同一個對象
cycle.draw();
cycle.draw();
// ======采用匿名對象======
drawMap(new Cycle()); // 傳的參數(shù)是匿名對象
drawMap(new Cycle()); // 實例化了兩個對象
new Cycle().draw();
new Cycle().draw();
}
}如果不采用匿名對象,則實例化一次的對象 cycle ,可以被多次傳參。
到此這篇關于Java中的抽象類與abstract 關鍵字使用詳解的文章就介紹到這了,更多相關java抽象類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java實現(xiàn)文件分片上傳并且斷點續(xù)傳的示例代碼
本文主要介紹了java實現(xiàn)文件分片上傳并且斷點續(xù)傳的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05
spring?boot項目實戰(zhàn)之實現(xiàn)與數(shù)據(jù)庫的連接
在我們?nèi)粘5拈_發(fā)過程中,肯定不可避免的會使用到數(shù)據(jù)庫以及SQL?語句,下面這篇文章主要給大家介紹了關于spring?boot項目實戰(zhàn)之實現(xiàn)與數(shù)據(jù)庫連接的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-05-05
springboot封裝JsonUtil,CookieUtil工具類代碼實例
這篇文章主要介紹了springboot封裝JsonUtil,CookieUtil工具類過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09

