Java抽象定義以及舉例代碼
一、概述
在OOP這個(gè)概念中,所有的對象都是通過類來描述的;但是并不是所有的類都是用來描述對象的。如果一個(gè)類沒有包含足夠的信息來描述一個(gè)具體的對象,這樣的類稱為抽象類。
抽象類:(1)抽象類不能實(shí)例化對象,如果實(shí)例化某個(gè)對象,編譯無法通過。只有抽象類的非抽象子類可以創(chuàng)建對象(2)可以包含:成員變量、成員方法、構(gòu)造方法等。(3)構(gòu)造方法、類方法(用static修飾的方法)不能聲明為抽象方法
抽象方法:(1)如果一個(gè)類包含抽象方法,那么該類一定是抽象類(2)任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類
定義:abstract class 類名
二、示例:農(nóng)民喂動物
Animal:抽象類--------getName()、move()、drink()
Reptile、Mammal:繼承抽象類
蛇、老虎、山羊、兔子:分別繼承Reptile或Mammal
fammer:bringWater()、feedWater(Animal animal)---- 負(fù)責(zé)將水帶到指定的地方,然后動物移動去目的地,喝水
代碼如下:
package abstractDemo; /** * @author lpx * @Description TODO * @date 2021-04-07 */ public abstract class Animal { abstract String getName(); abstract void move(String destination); abstract void drink(); } abstract class Reptile extends Animal{ } abstract class Mammal extends Animal{ } class Tiger extends Mammal{ private static String name="tiger"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("tiger move to "+destination+"."); } @Override void drink() { System.out.println("tiger lower it is head and drink"); } } class Goat extends Mammal{ private static String name="goat"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("goat move to "+destination+"."); } @Override void drink() { System.out.println("goat lower it head to drink"); } } class Rabbit extends Mammal{ private static String name="rabbit"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("rabbit move to "+destination+"."); } @Override void drink() { System.out.println("rabbit put out it is tongue and drink"); } } class Snake extends Reptile{ private static String name="snake"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("snake move to "+destination+"."); } @Override void drink() { System.out.println("snake dived into and drink"); } } class Farmer{ public void bringWater(String destination){ System.out.println("Farmer bring water to " + destination + "."); } public void feedWater(Animal a){ // polymorphism this.bringWater("Feeding Room"); a.move("Feeding Room"); a.drink(); } } class Test{ public static void main(String[] args) { Farmer fm=new Farmer(); Snake snake=new Snake(); Goat goat=new Goat(); Tiger tiger=new Tiger(); Rabbit rabbit=new Rabbit(); fm.feedWater(snake); fm.feedWater(goat); fm.feedWater(tiger); fm.feedWater(rabbit); } }
執(zhí)行結(jié)果:
總結(jié):
如果每種動物不是抽象出drink和move方法的話,就無法實(shí)現(xiàn)多態(tài)。農(nóng)夫類就需要根據(jù)參數(shù)的不同重載多個(gè)feedWater。如果繼續(xù)添加動物那么重載個(gè)數(shù)就越來越多。為了方便對比理解,我也按照常規(guī)思維去寫了一下,代碼如下:
package abstractDemo; /** * @author lpx * @Description TODO * @date 2021-04-07 */ class Tiger1{ private static String name="tiger"; String getName() { return this.name; } void move(String destination) { System.out.println("tiger move to "+destination+"."); } void drink() { System.out.println("tiger lower it is head and drink"); } } class Goat1{ private static String name="goat"; String getName() { return this.name; } void move(String destination) { System.out.println("goat move to "+destination+"."); } void drink() { System.out.println("goat lower it head to drink"); } } class Rabbit1{ private static String name="rabbit"; String getName() { return this.name; } void move(String destination) { System.out.println("rabbit move to "+destination+"."); } void drink() { System.out.println("rabbit put out it is tongue and drink"); } } class Farmer1{ public void bringWater(String destination){ System.out.println("Farmer bring water to " + destination + "."); } public void feedWater(Goat1 goat){ // polymorphism this.bringWater("Feeding Room"); goat.move("Feeding Room"); goat.drink(); } public void feedWater(Tiger1 tiger){ // polymorphism this.bringWater("Feeding Room"); tiger.move("Feeding Room"); tiger.drink(); } public void feedWater(Rabbit1 rabbit1) { this.bringWater("Feeding Room"); rabbit1.move("Feeding Room"); rabbit1.drink(); } } public class Test1{ public static void main(String[] args) { Farmer1 farmer1=new Farmer1(); Tiger1 tiger1=new Tiger1(); Goat1 goat1=new Goat1(); Rabbit1 rabbit1=new Rabbit1(); farmer1.feedWater(tiger1); farmer1.feedWater(goat1); farmer1.feedWater(rabbit1); } }
手敲了這個(gè)例子,發(fā)現(xiàn)基礎(chǔ)很重要呀,以前學(xué)習(xí)的不細(xì)致,導(dǎo)致很多地方迷糊不知道為啥那么寫。
(1)一個(gè).java文件中可以定義多個(gè)class類,但是只有一個(gè)可以定義為public,且這個(gè)類名必須和文件名相同
(2)抽象類繼承抽象類,不用覆蓋其抽象方法(原因也很簡單呀,本身他就是抽象的不能實(shí)現(xiàn)方法體)。而非抽象類繼承抽象類必須覆蓋抽象方法,非抽象方法非必要。
(3)重寫和重載的區(qū)別(高頻面試題 🤭)
重載:定義相同的方法名,參數(shù)不同。屬于編譯時(shí)多態(tài)
重寫:子類重寫父類的方法@Override。屬于運(yùn)行時(shí)多態(tài)
總結(jié)
到此這篇關(guān)于Java抽象定義以及舉例的文章就介紹到這了,更多相關(guān)Java抽象定義代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java獲取文件擴(kuò)展名的方法小結(jié)【正則與字符串截取】
這篇文章主要介紹了java獲取文件擴(kuò)展名的方法,結(jié)合實(shí)例形式分析了使用正則與字符串截取兩種獲取擴(kuò)展名的操作技巧,需要的朋友可以參考下2017-01-01JDK21新特性Record?Patterns記錄模式詳解(最新推薦)
這篇文章主要介紹了JDK21新特性Record?Patterns記錄模式詳解,本JEP建立在Pattern?Matching?for?instanceof(JEP?394)的基礎(chǔ)上,該功能已在JDK?16中發(fā)布,它與Pattern?Matching?for?switch(JEP?441)共同演進(jìn),需要的朋友可以參考下2023-09-09springboot+chatgpt+chatUI Pro開發(fā)智能聊天工具的實(shí)踐
本文主要介紹了springboot+chatgpt+chatUI Pro開發(fā)智能聊天工具的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java BigDecimal和double示例及相關(guān)問題解析
這篇文章主要介紹了Java BigDecimal和double示例及相關(guān)問題解析,簡單介紹了BigDecimal類的相關(guān)內(nèi)容,分享了兩則相關(guān)實(shí)例,對問題進(jìn)行了分析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11SpringBoot讀寫xml上傳到AWS存儲服務(wù)S3的示例
這篇文章主要介紹了SpringBoot讀寫xml上傳到S3的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-10-10