溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java面向?qū)ο笾鄳B(tài)的原理是什么與怎么實現(xiàn)

發(fā)布時間:2022-05-30 10:17:50 來源:億速云 閱讀:118 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Java面向?qū)ο笾鄳B(tài)的原理是什么與怎么實現(xiàn)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java面向?qū)ο笾鄳B(tài)的原理是什么與怎么實現(xiàn)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

何為多態(tài)

定義:

多態(tài)是指不同的子類在繼承父類后分別都重寫覆蓋了父類的方法,即父類同一個方法,在繼承的子類中表現(xiàn)出不同的形式。系統(tǒng)在運行時(而非編譯時),能夠根據(jù)其類型確定調(diào)用哪個重載的成員函數(shù)的能力,稱為多態(tài)性。

特點:

(1)多態(tài)是面向?qū)ο蟮闹匾匦?,簡單點說:“一個接口,多種實現(xiàn)”,就是同一種事物表現(xiàn)出的多種形態(tài)。

(2)多態(tài)就是抽象化的一種體現(xiàn),把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進(jìn)行對話。

(3)對不同類的對象發(fā)出相同的消息將會有不同的行為。

(4)多態(tài)允許將子類的對象當(dāng)作父類的對象使用,某父類型的引用指向其子類型的對象,調(diào)用的方法是該子類型的方法。這里引用和調(diào)用方法的代碼編譯前就已經(jīng)決定了,而引用所指向的對象可以在運行期間動態(tài)綁定。

(5)多態(tài)分為編譯時多態(tài)(函數(shù)參數(shù)個數(shù)不同或者參數(shù)類型不同)和運行時多態(tài)(虛函數(shù)和純虛函數(shù))。

作用:

(1)應(yīng)用程序不必為每一個派生類編寫功能調(diào)用,只需要對抽象基類進(jìn)行處理即可。大大提高程序的可復(fù)用性。//繼承

(2)派生類的功能可以被基類的方法或引用變量所調(diào)用,這叫向后兼容,可以提高可擴(kuò)充性和可維護(hù)性。

(3)隱藏實現(xiàn)細(xì)節(jié),使得代碼能夠模塊化(虛函數(shù))。

代碼實現(xiàn)

運算類:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : Operation
 * @description : [運算類]
 * @createTime : [2022/5/27 20:04]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:04]
 * @updateRemark : [描述說明本次修改內(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();
}

加法類:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : OperationAdd
 * @description : [加法類]
 * @createTime : [2022/5/27 20:13]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:13]
 * @updateRemark : [描述說明本次修改內(nèi)容]
 */
public class OperationAdd extends Operation {
    @Override
    public double getResult() {
        double result = 0;
        result = super.get_numberA() + super.get_numberB();
        return result;
    }
}

減法類:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : OperationSub
 * @description : [減法類]
 * @createTime : [2022/5/27 20:13]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:13]
 * @updateRemark : [描述說明本次修改內(nèi)容]
 */
public class OperationSub extends Operation {
    @Override
    public  double getResult() {
        double result = 0;
        result = super.get_numberA() - super.get_numberB();
        return result;
    }
}

乘法類:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : OperationMul
 * @description : [乘法類]
 * @createTime : [2022/5/27 20:15]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:15]
 * @updateRemark : [描述說明本次修改內(nèi)容]
 */
public class OperationMul extends Operation {
    @Override
    public double getResult() {
        double result = 0;
        result = super.get_numberA() * super.get_numberB();
        return result;
    }
}

除法類:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : OperationDiv
 * @description : [除法類]
 * @createTime : [2022/5/27 20:16]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:16]
 * @updateRemark : [描述說明本次修改內(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;
    }
}

簡單工廠類:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : OperationFactory
 * @description : [簡單工廠類]
 * @createTime : [2022/5/27 20:16]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:16]
 * @updateRemark : [描述說明本次修改內(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;
    }
}

客戶端主方法類:

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : Main
 * @description : [客戶端]
 * @createTime : [2022/5/27 20:18]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2022/5/27 20:18]
 * @updateRemark : [描述說明本次修改內(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)理解

我們都知道封裝是為了讓類的調(diào)用者不需要知道類的實現(xiàn)細(xì)節(jié),而多態(tài)能讓類的調(diào)用者連這個類的類型是什么都不必知道,只需要知道這個對象具有某個方法即可。

因此,多態(tài)可以理解成是封裝的更進(jìn)一步,讓類調(diào)用者對類的使用成本進(jìn)一步降低,提高程序的可擴(kuò)充性、可維護(hù)性、可復(fù)用性。

讀到這里,這篇“Java面向?qū)ο笾鄳B(tài)的原理是什么與怎么實現(xiàn)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI