詳解Java面向?qū)ο笾鄳B(tài)的原理與實(shí)現(xiàn)
何為多態(tài)
定義:
多態(tài)是指不同的子類(lèi)在繼承父類(lèi)后分別都重寫(xiě)覆蓋了父類(lèi)的方法,即父類(lèi)同一個(gè)方法,在繼承的子類(lèi)中表現(xiàn)出不同的形式。系統(tǒng)在運(yùn)行時(shí)(而非編譯時(shí)),能夠根據(jù)其類(lèi)型確定調(diào)用哪個(gè)重載的成員函數(shù)的能力,稱(chēng)為多態(tài)性。
特點(diǎn):
(1)多態(tài)是面向?qū)ο蟮闹匾匦裕?jiǎn)單點(diǎn)說(shuō):“一個(gè)接口,多種實(shí)現(xiàn)”,就是同一種事物表現(xiàn)出的多種形態(tài)。
(2)多態(tài)就是抽象化的一種體現(xiàn),把一系列具體事物的共同點(diǎn)抽象出來(lái), 再通過(guò)這個(gè)抽象的事物, 與不同的具體事物進(jìn)行對(duì)話(huà)。
(3)對(duì)不同類(lèi)的對(duì)象發(fā)出相同的消息將會(huì)有不同的行為。
(4)多態(tài)允許將子類(lèi)的對(duì)象當(dāng)作父類(lèi)的對(duì)象使用,某父類(lèi)型的引用指向其子類(lèi)型的對(duì)象,調(diào)用的方法是該子類(lèi)型的方法。這里引用和調(diào)用方法的代碼編譯前就已經(jīng)決定了,而引用所指向的對(duì)象可以在運(yùn)行期間動(dòng)態(tài)綁定。
(5)多態(tài)分為編譯時(shí)多態(tài)(函數(shù)參數(shù)個(gè)數(shù)不同或者參數(shù)類(lèi)型不同)和運(yùn)行時(shí)多態(tài)(虛函數(shù)和純虛函數(shù))。
作用:
(1)應(yīng)用程序不必為每一個(gè)派生類(lèi)編寫(xiě)功能調(diào)用,只需要對(duì)抽象基類(lèi)進(jìn)行處理即可。大大提高程序的可復(fù)用性。//繼承
(2)派生類(lèi)的功能可以被基類(lèi)的方法或引用變量所調(diào)用,這叫向后兼容,可以提高可擴(kuò)充性和可維護(hù)性。
(3)隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化(虛函數(shù))。
代碼實(shí)現(xiàn)
運(yùn)算類(lèi):
/**
* @author : [LiuYanQiang]
* @version : [v1.0]
* @className : Operation
* @description : [運(yùn)算類(lèi)]
* @createTime : [2022/5/27 20:04]
* @updateUser : [LiuYanQiang]
* @updateTime : [2022/5/27 20:04]
* @updateRemark : [描述說(shuō)明本次修改內(nèi)容]
*/
public abstract class Operation {
private double _numberA;
private double _numberB;
public double get_numberA() {
return _numberA;
}
public void set_numberA(double _numberA) {
this._numberA = _numberA;
}
public double get_numberB() {
return _numberB;
}
public void set_numberB(double _numberB) {
this._numberB = _numberB;
}
public abstract double getResult();
}加法類(lèi):
/**
* @author : [LiuYanQiang]
* @version : [v1.0]
* @className : OperationAdd
* @description : [加法類(lèi)]
* @createTime : [2022/5/27 20:13]
* @updateUser : [LiuYanQiang]
* @updateTime : [2022/5/27 20:13]
* @updateRemark : [描述說(shuō)明本次修改內(nèi)容]
*/
public class OperationAdd extends Operation {
@Override
public double getResult() {
double result = 0;
result = super.get_numberA() + super.get_numberB();
return result;
}
}減法類(lèi):
/**
* @author : [LiuYanQiang]
* @version : [v1.0]
* @className : OperationSub
* @description : [減法類(lèi)]
* @createTime : [2022/5/27 20:13]
* @updateUser : [LiuYanQiang]
* @updateTime : [2022/5/27 20:13]
* @updateRemark : [描述說(shuō)明本次修改內(nèi)容]
*/
public class OperationSub extends Operation {
@Override
public double getResult() {
double result = 0;
result = super.get_numberA() - super.get_numberB();
return result;
}
}乘法類(lèi):
/**
* @author : [LiuYanQiang]
* @version : [v1.0]
* @className : OperationMul
* @description : [乘法類(lèi)]
* @createTime : [2022/5/27 20:15]
* @updateUser : [LiuYanQiang]
* @updateTime : [2022/5/27 20:15]
* @updateRemark : [描述說(shuō)明本次修改內(nèi)容]
*/
public class OperationMul extends Operation {
@Override
public double getResult() {
double result = 0;
result = super.get_numberA() * super.get_numberB();
return result;
}
}除法類(lèi):
/**
* @author : [LiuYanQiang]
* @version : [v1.0]
* @className : OperationDiv
* @description : [除法類(lèi)]
* @createTime : [2022/5/27 20:16]
* @updateUser : [LiuYanQiang]
* @updateTime : [2022/5/27 20:16]
* @updateRemark : [描述說(shuō)明本次修改內(nèi)容]
*/
public class OperationDiv extends Operation {
@Override
public double getResult() {
double result = 0;
if (super.get_numberB() == 0) {
System.out.println("除數(shù)不能為0");
} else {
result = super.get_numberA() / super.get_numberB();
}
return result;
}
}簡(jiǎn)單工廠(chǎng)類(lèi):
/**
* @author : [LiuYanQiang]
* @version : [v1.0]
* @className : OperationFactory
* @description : [簡(jiǎn)單工廠(chǎng)類(lèi)]
* @createTime : [2022/5/27 20:16]
* @updateUser : [LiuYanQiang]
* @updateTime : [2022/5/27 20:16]
* @updateRemark : [描述說(shuō)明本次修改內(nèi)容]
*/
public class OperationFactory {
public static Operation createOperation(String operate) {
Operation operation = null;
switch (operate) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
return operation;
}
}客戶(hù)端主方法類(lèi):
/**
* @author : [LiuYanQiang]
* @version : [v1.0]
* @className : Main
* @description : [客戶(hù)端]
* @createTime : [2022/5/27 20:18]
* @updateUser : [LiuYanQiang]
* @updateTime : [2022/5/27 20:18]
* @updateRemark : [描述說(shuō)明本次修改內(nèi)容]
*/
public class Main {
public static void main(String[] args) {
Operation operation;
operation=OperationFactory.createOperation("+");
operation.set_numberA(1);
operation.set_numberB(2);
System.out.println(operation.getResult());
}
}多態(tài)理解
我們都知道封裝是為了讓類(lèi)的調(diào)用者不需要知道類(lèi)的實(shí)現(xiàn)細(xì)節(jié),而多態(tài)能讓類(lèi)的調(diào)用者連這個(gè)類(lèi)的類(lèi)型是什么都不必知道,只需要知道這個(gè)對(duì)象具有某個(gè)方法即可。
因此,多態(tài)可以理解成是封裝的更進(jìn)一步,讓類(lèi)調(diào)用者對(duì)類(lèi)的使用成本進(jìn)一步降低,提高程序的可擴(kuò)充性、可維護(hù)性、可復(fù)用性。
以上就是詳解Java面向?qū)ο笾鄳B(tài)的原理與實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Java多態(tài)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java數(shù)組與二維數(shù)組及替換空格實(shí)戰(zhàn)真題講解
數(shù)組對(duì)于每一門(mén)編程語(yǔ)言來(lái)說(shuō)都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語(yǔ)言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java?語(yǔ)言中提供的數(shù)組是用來(lái)存儲(chǔ)固定大小的同類(lèi)型元素,這篇文章主要介紹了Java數(shù)組與二維數(shù)組及替換空格實(shí)戰(zhàn)真題講解2022-07-07
mybatis-plus如何配置自定義數(shù)據(jù)類(lèi)型TypeHandle
這篇文章主要介紹了mybatis-plus如何配置自定義數(shù)據(jù)類(lèi)型TypeHandle,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java Mybatis框架增刪查改與核心配置詳解流程與用法
MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過(guò)簡(jiǎn)單的 XML 或注解來(lái)配置和映射原始類(lèi)型、接口和 Java POJO為數(shù)據(jù)庫(kù)中的記錄2021-10-10
JavaEE開(kāi)發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳
本篇文章主要介紹了SpringMVC的相關(guān)知識(shí)。同時(shí)也會(huì)介紹到j(luò)s、css這些靜態(tài)文件的加載配置,以及服務(wù)器推送的兩種實(shí)現(xiàn)方式并且給出了兩者的區(qū)別。下面跟著小編一起來(lái)看下吧2017-04-04
基于Maven導(dǎo)入pom依賴(lài)很慢的解決方案
這篇文章主要介紹了Maven導(dǎo)入pom依賴(lài)很慢的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
一篇文章帶你搞懂Java線(xiàn)程池實(shí)現(xiàn)原理
線(xiàn)程池?zé)o論是工作還是面試都是必備的技能,但是很多人對(duì)于線(xiàn)程池的實(shí)現(xiàn)原理卻一知半解,并不了解線(xiàn)程池內(nèi)部的工作原理,今天就帶大家一塊剖析線(xiàn)程池底層實(shí)現(xiàn)原理2022-11-11
java實(shí)現(xiàn)查找PDF關(guān)鍵字所在頁(yè)碼及其坐標(biāo)
這篇文章主要介紹了java實(shí)現(xiàn)查找PDF關(guān)鍵字所在頁(yè)碼及其坐標(biāo)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
IDEA使用properties配置文件進(jìn)行mysql數(shù)據(jù)庫(kù)連接的教程圖解
Properties類(lèi)是 鍵和值均為字符串的可以永久存儲(chǔ)到文件中的key-value集合。這篇文章主要介紹了IDEA使用properties配置文件進(jìn)行mysql數(shù)據(jù)路連接 ,需要的朋友可以參考下2018-10-10

