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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
把Jar文件轉(zhuǎn)成exe安裝文件的實現(xiàn)方法
下面小編就為大家?guī)硪黄袹ar文件轉(zhuǎn)成exe安裝文件的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
IntelliJ IDEA打開多個Maven的module且相互調(diào)用代碼的方法
這篇文章主要介紹了IntelliJ IDEA打開多個Maven的module且相互調(diào)用代碼的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
使用idea搭建spring項目,利用xml文件的形式進行配置方式
本文介紹了如何使用SpringIOC和SpringDI的思想開發(fā)一個打印機模擬程序,實現(xiàn)了靈活配置彩色墨盒或灰色墨盒以及打印頁面大小的功能,通過創(chuàng)建接口和實現(xiàn)類,并在配置文件中進行依賴注入,實現(xiàn)了控制反轉(zhuǎn)2024-11-11
SpringBoot統(tǒng)一接口返回及全局異常處理高級用法
這篇文章主要為大家介紹了SpringBoot統(tǒng)一接口返回及全局異常處理高級用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
詳解@Autowired(required=false)注入注意的問題
這篇文章主要介紹了@Autowired(required=false)注入注意的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
spring使用RedisTemplate的操作類訪問Redis
本篇文章主要介紹了spring使用RedisTemplate的操作類訪問Redis,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05

