Java抽象定義以及舉例代碼
一、概述
在OOP這個概念中,所有的對象都是通過類來描述的;但是并不是所有的類都是用來描述對象的。如果一個類沒有包含足夠的信息來描述一個具體的對象,這樣的類稱為抽象類。
抽象類:(1)抽象類不能實例化對象,如果實例化某個對象,編譯無法通過。只有抽象類的非抽象子類可以創(chuàng)建對象(2)可以包含:成員變量、成員方法、構造方法等。(3)構造方法、類方法(用static修飾的方法)不能聲明為抽象方法
抽象方法:(1)如果一個類包含抽象方法,那么該類一定是抽象類(2)任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類
定義:abstract class 類名
二、示例:農(nóng)民喂動物
Animal:抽象類--------getName()、move()、drink()
Reptile、Mammal:繼承抽象類
蛇、老虎、山羊、兔子:分別繼承Reptile或Mammal
fammer:bringWater()、feedWater(Animal animal)---- 負責將水帶到指定的地方,然后動物移動去目的地,喝水
代碼如下:
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í)行結果:
總結:
如果每種動物不是抽象出drink和move方法的話,就無法實現(xiàn)多態(tài)。農(nóng)夫類就需要根據(jù)參數(shù)的不同重載多個feedWater。如果繼續(xù)添加動物那么重載個數(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); } }
手敲了這個例子,發(fā)現(xiàn)基礎很重要呀,以前學習的不細致,導致很多地方迷糊不知道為啥那么寫。
(1)一個.java文件中可以定義多個class類,但是只有一個可以定義為public,且這個類名必須和文件名相同
(2)抽象類繼承抽象類,不用覆蓋其抽象方法(原因也很簡單呀,本身他就是抽象的不能實現(xiàn)方法體)。而非抽象類繼承抽象類必須覆蓋抽象方法,非抽象方法非必要。
(3)重寫和重載的區(qū)別(高頻面試題 🤭)
重載:定義相同的方法名,參數(shù)不同。屬于編譯時多態(tài)
重寫:子類重寫父類的方法@Override。屬于運行時多態(tài)
總結
到此這篇關于Java抽象定義以及舉例的文章就介紹到這了,更多相關Java抽象定義代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JDK21新特性Record?Patterns記錄模式詳解(最新推薦)
這篇文章主要介紹了JDK21新特性Record?Patterns記錄模式詳解,本JEP建立在Pattern?Matching?for?instanceof(JEP?394)的基礎上,該功能已在JDK?16中發(fā)布,它與Pattern?Matching?for?switch(JEP?441)共同演進,需要的朋友可以參考下2023-09-09springboot+chatgpt+chatUI Pro開發(fā)智能聊天工具的實踐
本文主要介紹了springboot+chatgpt+chatUI Pro開發(fā)智能聊天工具的實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04Java BigDecimal和double示例及相關問題解析
這篇文章主要介紹了Java BigDecimal和double示例及相關問題解析,簡單介紹了BigDecimal類的相關內(nèi)容,分享了兩則相關實例,對問題進行了分析,具有一定參考價值,需要的朋友可以了解下。2017-11-11SpringBoot讀寫xml上傳到AWS存儲服務S3的示例
這篇文章主要介紹了SpringBoot讀寫xml上傳到S3的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-10-10