Java抽象定義以及舉例代碼
一、概述
在OOP這個(gè)概念中,所有的對(duì)象都是通過(guò)類(lèi)來(lái)描述的;但是并不是所有的類(lèi)都是用來(lái)描述對(duì)象的。如果一個(gè)類(lèi)沒(méi)有包含足夠的信息來(lái)描述一個(gè)具體的對(duì)象,這樣的類(lèi)稱(chēng)為抽象類(lèi)。
抽象類(lèi):(1)抽象類(lèi)不能實(shí)例化對(duì)象,如果實(shí)例化某個(gè)對(duì)象,編譯無(wú)法通過(guò)。只有抽象類(lèi)的非抽象子類(lèi)可以創(chuàng)建對(duì)象(2)可以包含:成員變量、成員方法、構(gòu)造方法等。(3)構(gòu)造方法、類(lèi)方法(用static修飾的方法)不能聲明為抽象方法
抽象方法:(1)如果一個(gè)類(lèi)包含抽象方法,那么該類(lèi)一定是抽象類(lèi)(2)任何子類(lèi)必須重寫(xiě)父類(lèi)的抽象方法,或者聲明自身為抽象類(lèi)
定義:abstract class 類(lèi)名
二、示例:農(nóng)民喂動(dòng)物
Animal:抽象類(lèi)--------getName()、move()、drink()
Reptile、Mammal:繼承抽象類(lèi)
蛇、老虎、山羊、兔子:分別繼承Reptile或Mammal
fammer:bringWater()、feedWater(Animal animal)---- 負(fù)責(zé)將水帶到指定的地方,然后動(dòng)物移動(dòng)去目的地,喝水

代碼如下:
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é):
如果每種動(dòng)物不是抽象出drink和move方法的話,就無(wú)法實(shí)現(xiàn)多態(tài)。農(nóng)夫類(lèi)就需要根據(jù)參數(shù)的不同重載多個(gè)feedWater。如果繼續(xù)添加動(dòng)物那么重載個(gè)數(shù)就越來(lái)越多。為了方便對(duì)比理解,我也按照常規(guī)思維去寫(xiě)了一下,代碼如下:
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)致很多地方迷糊不知道為啥那么寫(xiě)。
(1)一個(gè).java文件中可以定義多個(gè)class類(lèi),但是只有一個(gè)可以定義為public,且這個(gè)類(lèi)名必須和文件名相同
(2)抽象類(lèi)繼承抽象類(lèi),不用覆蓋其抽象方法(原因也很簡(jiǎn)單呀,本身他就是抽象的不能實(shí)現(xiàn)方法體)。而非抽象類(lèi)繼承抽象類(lèi)必須覆蓋抽象方法,非抽象方法非必要。
(3)重寫(xiě)和重載的區(qū)別(高頻面試題 🤭)
重載:定義相同的方法名,參數(shù)不同。屬于編譯時(shí)多態(tài)
重寫(xiě):子類(lèi)重寫(xiě)父類(lèi)的方法@Override。屬于運(yùn)行時(shí)多態(tài)
總結(jié)
到此這篇關(guān)于Java抽象定義以及舉例的文章就介紹到這了,更多相關(guān)Java抽象定義代碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java獲取文件擴(kuò)展名的方法小結(jié)【正則與字符串截取】
這篇文章主要介紹了java獲取文件擴(kuò)展名的方法,結(jié)合實(shí)例形式分析了使用正則與字符串截取兩種獲取擴(kuò)展名的操作技巧,需要的朋友可以參考下2017-01-01
JDK21新特性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-09
springboot+chatgpt+chatUI Pro開(kāi)發(fā)智能聊天工具的實(shí)踐
本文主要介紹了springboot+chatgpt+chatUI Pro開(kāi)發(fā)智能聊天工具的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
shiro多驗(yàn)證登錄代碼實(shí)例及問(wèn)題解決
這篇文章主要介紹了shiro多驗(yàn)證登錄代碼實(shí)例及問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Java BigDecimal和double示例及相關(guān)問(wèn)題解析
這篇文章主要介紹了Java BigDecimal和double示例及相關(guān)問(wèn)題解析,簡(jiǎn)單介紹了BigDecimal類(lèi)的相關(guān)內(nèi)容,分享了兩則相關(guān)實(shí)例,對(duì)問(wèn)題進(jìn)行了分析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
SpringBoot讀寫(xiě)xml上傳到AWS存儲(chǔ)服務(wù)S3的示例
這篇文章主要介紹了SpringBoot讀寫(xiě)xml上傳到S3的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-10-10

