溫馨提示×

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

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

java對(duì)象實(shí)例化過程中的多態(tài)特性怎么理解

發(fā)布時(shí)間:2021-12-06 08:56:02 來源:億速云 閱讀:153 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“java對(duì)象實(shí)例化過程中的多態(tài)特性怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“java對(duì)象實(shí)例化過程中的多態(tài)特性怎么理解”吧!

java 對(duì)象實(shí)例化過程中的多態(tài)特性

執(zhí)行對(duì)象實(shí)例化過程中遵循多態(tài)特性 ==> 調(diào)用的方法都是實(shí)例化的子類中的重寫方法,只有明確調(diào)用了super.xxx關(guān)鍵詞或者是子類中沒有該方法時(shí),才會(huì)去調(diào)用父類相同的同名方法。

通過案例說明

package com.njau.test1; 
class Test {
    public static void main(String[] args) {
        System.out.println(new B().getValue());
    }
    static class A {
        protected int value;
        public A (int v) {
            setValue(v);
        }
        public void setValue(int value) {
            this.value= value;
        }
        public int getValue() {
            try {
                value ++;
                return value;
            } finally {
                this.setValue(value);
                System.out.println(value);
            }
        }
    }
    static class B extends A {
        public B () {
            super(5);
            setValue(getValue()- 3);
        }
        public void setValue(int value) {
            super.setValue(2 * value);
        }
    }
}

通過上述代碼

始終明確調(diào)用的方法必須是實(shí)例化子類中重寫的方法。

首先,在main函數(shù)中,【new B()】new了一個(gè)B類的實(shí)例化對(duì)象,在實(shí)例化對(duì)象時(shí),調(diào)用了B類中的構(gòu)造函數(shù),執(zhí)行【super(5)】,也就是public A(int v)------>setValue(v),由于調(diào)用的方法必須是實(shí)例化子類中重寫的方法的原則。因此,這里調(diào)用的是B類中的setValue(v)方法,此時(shí)B實(shí)例的value值設(shè)置為2 x 5 = 10,后執(zhí)行super.setValue(10),將value=10的值存儲(chǔ)起來。

執(zhí)行完super(5)后,執(zhí)行構(gòu)造函數(shù)中的【setValue(getValue()- 3)】中【getValue()】,由于B類中沒有g(shù)etValue()方法,則調(diào)用父類(A類)中的getValue()方法,value++所得到的值為11,并存儲(chǔ)在value中(先執(zhí)行finally中的部分,后執(zhí)行try中的return),在finally中,調(diào)用了【this.setValue(value)】,由于調(diào)用的方法必須是實(shí)例化子類中重寫的方法的原則,調(diào)用的是B類中的setValue(v)方法,此時(shí)B實(shí)例的value值設(shè)置為2 x 11= 22,之后執(zhí)行System.out.println(value)

即在控制臺(tái)上打印22

執(zhí)行完finally中的部分,后執(zhí)行try中的return,將value++執(zhí)行后,存儲(chǔ)在value中的11,return回去;執(zhí)行【setValue(getValue()- 3)】

即:setValue(8)

執(zhí)行setValue(8)時(shí),由于調(diào)用的方法必須是實(shí)例化子類中重寫的方法的原則,則調(diào)用B類中的setValue(v)方法,此時(shí)B實(shí)例的value值設(shè)置為2 x 8= 16;此時(shí)B類中的構(gòu)造函數(shù)執(zhí)行結(jié)束。

在實(shí)例化對(duì)象以后,執(zhí)行【new B().getValue()】,由于B類中沒有g(shù)etValue()方法,則調(diào)用父類(A類)中的getValue()方法,value++所得到的值為17,并存儲(chǔ)在value中,在finally中,調(diào)用了【this.setValue(value)】,由于調(diào)用的方法必須是實(shí)例化子類中重寫的方法的原則,調(diào)用的是B類中的setValue(v)方法,此時(shí)B實(shí)例的value值設(shè)置為2 x 17= 34,之后執(zhí)行System.out.println(value)

即在控制臺(tái)上打印34

執(zhí)行完finally中的部分,后執(zhí)行try中的return,將value++執(zhí)行后,存儲(chǔ)在value中的17,return回去;執(zhí)行【System.out.println(new B().getValue())】

即在控制臺(tái)上打印17

value值的變化過程,僅解釋實(shí)例化對(duì)象時(shí),構(gòu)造函數(shù)中:super(5)與setValue(getValue()+3)兩部分。圖中兩條線,起點(diǎn)分別為【new B()】與【setValue(getValue()+3)】:

java對(duì)象實(shí)例化過程中的多態(tài)特性怎么理解

執(zhí)行結(jié)果為:

java對(duì)象實(shí)例化過程中的多態(tài)特性怎么理解

java對(duì)象的三個(gè)特性(封裝、繼承、多態(tài))

類(類型)和對(duì)象:對(duì)象是獨(dú)一無二的。對(duì)象有其所屬之類型。對(duì)象是類型的一個(gè)具體的實(shí)例。

創(chuàng)建編寫一個(gè) class :定義一個(gè)類型。類型是編寫出來的,即使程序不運(yùn)行,類型已然存在。

對(duì)象:對(duì)象是new出來的,在程序運(yùn)行期間new出來的,存在于內(nèi)存中(堆中 )。如果程序未運(yùn)行,則對(duì)象不存在。

對(duì)象的三大特性:

1.封裝

1.1 把本屬于某個(gè)類型的成員屬性(靜態(tài)特性)和職責(zé)(動(dòng)態(tài)特性)定義到一個(gè)類中。

1.2 訪問權(quán)限控制:使用權(quán)限訪問修飾符控制成員(屬性和方法)的訪問(可見性)。

  • private:最小訪問權(quán)限,僅限類的內(nèi)部可以訪問。

  • <無修飾符>:包修飾符,友好訪問修飾符,類內(nèi),包內(nèi)可以訪問。

  • protected:類內(nèi),包內(nèi),子類可以訪問。

  • public:類內(nèi),包內(nèi),子類,包外都可以訪問。

類的兩大成員:

1.屬性:有默認(rèn)值,0 0.0 false '\0' null。引用類型的默認(rèn)值是null值。

2.方法:方法中,可以訪問成員屬性。

構(gòu)造方法:

用于構(gòu)造對(duì)象(對(duì)對(duì)象進(jìn)行成員屬性初始化),構(gòu)造對(duì)象的過程可能簡(jiǎn)單,也可能復(fù)雜。

  • 和類同名。語法:new 構(gòu)造方法(參數(shù)列表)

  • 無返回值。其作用僅為構(gòu)造對(duì)象。

  • 構(gòu)造方法可以重載。

this關(guān)鍵字:

  • 訪問當(dāng)前對(duì)象的屬性和方法。

  • this(參數(shù)列表),只能放在構(gòu)造方法的第一行,并且只能單獨(dú)使用。

  • 當(dāng)方法的參數(shù)和成員屬性名稱沖突的時(shí)候,可以使用this進(jìn)行區(qū)分。

2.繼承

2.1 為什么要繼承:消除重復(fù)。子類可以繼承父類的某些成員。

2.2 extends 關(guān)鍵字:擴(kuò)展。一個(gè)類只能繼承一個(gè)父類。如果沒有指定父類的話,則默認(rèn)繼承自O(shè)bject類。Object類是根類型,終級(jí)類,沒有父類。其它一切引用類型都是直接或間接繼承自O(shè)bject類型。

2.3 什么成員可以被繼承?1. 私有成員不能被繼承。2. 構(gòu)造方法不能被繼承。

2.4 子類對(duì)象構(gòu)造的過程:按照繼承的順序,遞歸創(chuàng)建各類型的狀態(tài)值。

3.多態(tài)

同一個(gè)類型所展現(xiàn)出的行為或?qū)傩缘亩喾N形態(tài)。

使用父類(祖先類、接口)的引用指向子類(派生類,實(shí)現(xiàn)類)的對(duì)象。

多態(tài)的使用場(chǎng)景:某些場(chǎng)景,只希望關(guān)注某些(不同的具體類型)類型的共性(祖先類,接口),而忽略其它獨(dú)特的特性。

final:

  • 修飾類,表示類不可被繼承。

  • 修飾方法,表示方法不能被重寫。

  • 修飾成員屬性,或者普通變量,表示值不可修改。

static:靜態(tài)的

  • 一旦屬性和方法,添加了static關(guān)鍵字,表示屬性和方法是屬于類的,而不是屬于某一個(gè)具體的對(duì)象的。

  • 通過“類名.靜態(tài)成員”來訪問,而無須先創(chuàng)建對(duì)象。

抽象類:

  • 當(dāng)定義一個(gè)類時(shí),如果某個(gè)方法暫時(shí)不便實(shí)現(xiàn),或者無法實(shí)現(xiàn),或者不適合實(shí)現(xiàn),或者希望具體的子類來提供實(shí)現(xiàn),可以使用abstract關(guān)鍵字來修飾此方法,表示抽象方法,抽象方法無需提供實(shí)現(xiàn)。

  • 當(dāng)一個(gè)類中存在抽象方法時(shí),類必須定義成抽象類。但是,一個(gè)抽象類中可以沒有抽象方法。

  • 抽象類不能實(shí)例化,但可以定義構(gòu)造方法。

  • 抽象類是類,擁有一切類的特性,除了不能實(shí)例化。

接口:

  • 接口不是類。但是接口和抽象類類似。

  • 接口中的方法全都是公有的抽象方法。jdk8之前。

  • 接口中的屬性,都是公有的靜態(tài)的最終的。

  • 接口需要類來提供實(shí)現(xiàn)。implements關(guān)鍵字。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,相當(dāng)于將所有這些接口的方法提供實(shí)現(xiàn)。

  • 接口可以繼承接口,使用 extends 關(guān)鍵字。

  • 接口也可以使用多態(tài)特性,使用接口的引用指向?qū)崿F(xiàn)類的實(shí)例。

  • 接口的主要目的(作用)就是多態(tài)。

到此,相信大家對(duì)“java對(duì)象實(shí)例化過程中的多態(tài)特性怎么理解”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

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

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

AI