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

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

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

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

