一篇文章帶你了解Java基礎(chǔ)-抽象
Java基礎(chǔ)知識(shí)(抽象)
抽象
抽象是從眾多的事物中抽取出共同的、本質(zhì)性的特征,而舍棄其非本質(zhì)的特征的過(guò)程。具體地說(shuō),抽象就是人們?cè)趯?shí)踐的基礎(chǔ)上,對(duì)于豐富的感性材料通過(guò)去粗取精、去偽存真、由此及彼、由表及里的加工制作,形成概念、判斷、推理等思維形式,以反映事物的本質(zhì)和規(guī)律的方法。
抽象定義
在繼承過(guò)程中,我們知道父類的方法可以子類進(jìn)行重寫,而每個(gè)子類各自的實(shí)現(xiàn)都不盡相同。就好比動(dòng)物都有吃的方法行為吧,而每個(gè)動(dòng)物的子類對(duì)于吃的東西都可能不是相同滴,可是這導(dǎo)致了什么呢?
我們定義父類的方法主體是不是就沒(méi)有任何意義了,因?yàn)樵谧宇愓{(diào)用方法過(guò)程中,是調(diào)用了自己重寫的方法,而不是父類的方法。
也就是說(shuō),父類聲明了方法,子類去各自實(shí)現(xiàn)該方法即可。代表著父類可以不知道具體實(shí)現(xiàn)是什么,但是清楚的有什么方法是需要的。所以方法父類完全只需要提供一個(gè)沒(méi)有方法體的方法簽名即可,具體實(shí)現(xiàn)交給子類自己去實(shí)現(xiàn)。
而我們對(duì)于這種沒(méi)有方法體的方法稱為抽象方法。在Java語(yǔ)法規(guī)定,包含抽象方法的類就是抽象類。
- 抽象方法 : 沒(méi)有方法體的方法。
- 抽象類:包含抽象方法的類。
定義抽象的關(guān)鍵字:abstract,接下來(lái)看看如何使用吧!
abstract的使用
abstract是抽象的意思,用于修飾方法方法和類,修飾的方法是抽象方法,修飾的類是抽象類。
抽象方法:
使用abstract 關(guān)鍵字修飾方法,該方法就成了抽象方法,抽象方法只包含一個(gè)方法名,而沒(méi)有方法體。
定義格式:
權(quán)限修飾符 abstract 返回值類型 方法名 (參數(shù)列表);
代碼如下:
public abstract void eat();
抽象類:
如果一個(gè)類包含抽象方法,那么該類必須是抽象類。
注意:抽象類不一定有抽象方法,但是有抽象方法的類必須定義成抽象類。
定義格式:
abstract class 類名字 {
}
代碼如下:
public abstract class Animal {
public abstract void eat();
}
定義抽象類
我們將之前的動(dòng)物類改造成抽象類,然后吃的方法也改造成抽象方法。
注意:一旦定義為抽象類后,子類繼承父類時(shí),是必須重寫里面的抽象方法。
定義抽象父類:
package com.na.pojo;
/**
* 先定義一個(gè)抽象父類 --> 動(dòng)物類
* 動(dòng)物都有一個(gè)吃的抽象方法
*/
public abstract class Animal {
// 定義為抽象方法后,無(wú)需去做方法實(shí)體的實(shí)現(xiàn)!
public abstract void eat();
}
定義子類:
貓咪:
package com.na.pojo;
/**
* 定義貓類繼承抽象動(dòng)物類,
* 隨之重寫里面的吃行為,因?yàn)樨堃灿谐缘男袨椋秦埾矚g吃罐頭
*/
public class Cat extends Animal{
// 抽象類的方法必須重寫,不然編譯會(huì)不通過(guò)。
public void eat() {
System.out.println("小喵咪都喜歡吃魚罐頭!");
}
/**
* 增加一哥貓咪特有的玩球方法()
*/
public void playBall() {
System.out.println("小喵咪都喜歡小球!");
}
}
小狗:
package com.na.pojo;
/**
* 定義狗類繼承抽象動(dòng)物類,
* 隨之重寫里面的吃行為,因?yàn)楣芬灿谐缘男袨椋枪废矚g啃骨頭
*/
public class Dog extends Animal{
// 抽象類的方法必須重寫,不然編譯會(huì)不通過(guò)。
public void eat() {
System.out.println("小狗狗都愛啃骨頭!");
}
public void walk() {
System.out.println("小狗在被我溜著!");
}
}
定義測(cè)試類:
package com.na;
import com.na.pojo.Animal;
import com.na.pojo.Cat;
import com.na.pojo.Dog;
public class Demo {
public static void main(String[] args) {
// 創(chuàng)建抽象類,抽象類不能創(chuàng)建對(duì)象
// Animal animal = new Animal();
// animal.eat();
// 創(chuàng)建小貓咪
Cat cat = new Cat();
cat.eat();
cat.playBall();
Dog dog = new Dog();
dog.eat();
dog.walk();
}
}
得到結(jié)果:
小喵咪都喜歡吃魚罐頭!
小喵咪都喜歡小球!
小狗狗都愛啃骨頭!
小狗在被我溜著!
類的大致結(jié)構(gòu):

注意:假設(shè)抽象類可以創(chuàng)建對(duì)象,但是呢,里面的抽象方法是沒(méi)有方法體給我們?nèi)?shí)現(xiàn),從而程序也是無(wú)法執(zhí)行,所以不讓我們創(chuàng)建對(duì)象。
抽象類的一些注意點(diǎn)
對(duì)于抽象類的使用,以下為抽象類的使用上要注意的細(xì)節(jié):
1.抽象類不能創(chuàng)建對(duì)象,如果創(chuàng)建,編譯無(wú)法通過(guò)而報(bào)錯(cuò)。只能創(chuàng)建其非抽象子類的對(duì)象。
假設(shè)創(chuàng)建了抽象類的對(duì)象,調(diào)用抽象的方法,而抽象方法沒(méi)有具體的方法體,沒(méi)有意義。
2.抽象類中,可以有構(gòu)造器,是供子類創(chuàng)建對(duì)象時(shí),初始化父類成員使用的。
子類的構(gòu)造方法中,有默認(rèn)的super(),需要訪問(wèn)父類構(gòu)造方法。
package com.na.pojo;
/**
* 先定義一個(gè)抽象父類 --> 動(dòng)物類
* 動(dòng)物都有一個(gè)吃的抽象方法
*/
public abstract class Animal {
private String name;
private int age;
// 可以有構(gòu)造器
public Animal(){
}
// 甚至可以有參構(gòu)造器
public Animal(String name, int age){
this.name = name;
this.age = age;
}
// 定義為抽象方法后,無(wú)需去做方法實(shí)體的實(shí)現(xiàn)!
public abstract void eat();
}
3.抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
未包含抽象方法的抽象類,目的就是不想讓調(diào)用者創(chuàng)建該類對(duì)象,通常用于某些特殊的類結(jié)構(gòu)設(shè)計(jì)。
4.抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則子類也必須定義成抽象類,編譯無(wú)法通過(guò)而報(bào)錯(cuò)。
如果子類不重寫所有抽象方法,則類中可能會(huì)包含抽象方法。那么在創(chuàng)建對(duì)象后,調(diào)用抽象的方法,沒(méi)有意義。
5.抽象類存在的意義是為了被子類繼承,抽象類體現(xiàn)的是模板思想。
抽象類中已經(jīng)實(shí)現(xiàn)的是模板中確定的成員,抽象類不確定如何實(shí)現(xiàn)的定義成抽象方法,交給具體的子類去實(shí)現(xiàn)。
總結(jié)
相信各位看官都對(duì)Java基礎(chǔ)中的抽象的知識(shí)和使用有了一定了解,等待下一次更多Java基礎(chǔ)的學(xué)習(xí)吧!
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot項(xiàng)目啟動(dòng)時(shí)提示程序包不存在和找不到符號(hào)的處理方法
最近接手同事開發(fā)的一個(gè)Springboot工作項(xiàng)目,從svn上整體拉取下來(lái)后,構(gòu)建完成后,啟動(dòng)的時(shí)候遇到了程序包找不到的情況,所以本文記錄了SpringBoot項(xiàng)目啟動(dòng)時(shí)提示程序包不存在和找不到符號(hào)的處理方法,需要的朋友可以參考下2024-05-05
java?mybatis如何操作postgresql?array數(shù)組類型
這篇文章主要介紹了java?mybatis如何操作postgresql?array數(shù)組類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
java如何刪除以逗號(hào)隔開的字符串中某一個(gè)值
這篇文章主要介紹了java如何刪除以逗號(hào)隔開的字符串中某一個(gè)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
springboot使用logback文件查看錯(cuò)誤日志過(guò)程詳解
這篇文章主要介紹了springboot使用logback文件查看錯(cuò)誤日志過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
如何用120行Java代碼寫一個(gè)自己的區(qū)塊鏈
這篇文章就是幫助你使用 Java 語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的區(qū)塊鏈,用不到 120 行代碼來(lái)揭示區(qū)塊鏈的原理,感興趣的就一起來(lái)了解一下2019-06-06
IDEA 中 30 秒創(chuàng)建一個(gè) Spring Cloud Alibaba 工程
這篇文章主要介紹了IDEA 中 30 秒生成 Spring Cloud Alibaba 工程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
MyBatis-Plus中提供的各種注解詳細(xì)說(shuō)明
這篇文章主要介紹了MyBatis-Plus中提供的各種注解詳細(xì)說(shuō)明,下面對(duì)MyBatis-Plus提供的注解進(jìn)行整理,本文提供了部分示例代碼以方便理解,需要的朋友可以參考下2023-11-11

