java?對(duì)象實(shí)例化過(guò)程中的多態(tài)特性解析
java 對(duì)象實(shí)例化過(guò)程中的多態(tài)特性
執(zhí)行對(duì)象實(shí)例化過(guò)程中遵循多態(tài)特性 ==> 調(diào)用的方法都是實(shí)例化的子類(lèi)中的重寫(xiě)方法,只有明確調(diào)用了super.xxx關(guān)鍵詞或者是子類(lèi)中沒(méi)有該方法時(shí),才會(huì)去調(diào)用父類(lèi)相同的同名方法。
通過(guò)案例說(shuō)明
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);
}
}
}
通過(guò)上述代碼
始終明確調(diào)用的方法必須是實(shí)例化子類(lèi)中重寫(xiě)的方法。
首先,在main函數(shù)中,【new B()】new了一個(gè)B類(lèi)的實(shí)例化對(duì)象,在實(shí)例化對(duì)象時(shí),調(diào)用了B類(lèi)中的構(gòu)造函數(shù),執(zhí)行【super(5)】,也就是public A(int v)------>setValue(v),由于調(diào)用的方法必須是實(shí)例化子類(lèi)中重寫(xiě)的方法的原則。因此,這里調(diào)用的是B類(lèi)中的setValue(v)方法,此時(shí)B實(shí)例的value值設(shè)置為2 x 5 = 10,后執(zhí)行super.setValue(10),將value=10的值存儲(chǔ)起來(lái)。
執(zhí)行完super(5)后,執(zhí)行構(gòu)造函數(shù)中的【setValue(getValue()- 3)】中【getValue()】,由于B類(lèi)中沒(méi)有g(shù)etValue()方法,則調(diào)用父類(lèi)(A類(lèi))中的getValue()方法,value++所得到的值為11,并存儲(chǔ)在value中(先執(zhí)行finally中的部分,后執(zhí)行try中的return),在finally中,調(diào)用了【this.setValue(value)】,由于調(diào)用的方法必須是實(shí)例化子類(lèi)中重寫(xiě)的方法的原則,調(diào)用的是B類(lèi)中的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í)例化子類(lèi)中重寫(xiě)的方法的原則,則調(diào)用B類(lèi)中的setValue(v)方法,此時(shí)B實(shí)例的value值設(shè)置為2 x 8= 16;此時(shí)B類(lèi)中的構(gòu)造函數(shù)執(zhí)行結(jié)束。
在實(shí)例化對(duì)象以后,執(zhí)行【new B().getValue()】,由于B類(lèi)中沒(méi)有g(shù)etValue()方法,則調(diào)用父類(lèi)(A類(lèi))中的getValue()方法,value++所得到的值為17,并存儲(chǔ)在value中,在finally中,調(diào)用了【this.setValue(value)】,由于調(diào)用的方法必須是實(shí)例化子類(lèi)中重寫(xiě)的方法的原則,調(diào)用的是B類(lèi)中的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值的變化過(guò)程,僅解釋實(shí)例化對(duì)象時(shí),構(gòu)造函數(shù)中:super(5)與setValue(getValue()+3)兩部分。圖中兩條線,起點(diǎn)分別為【new B()】與【setValue(getValue()+3)】:

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

java對(duì)象的三個(gè)特性(封裝、繼承、多態(tài))
類(lèi)(類(lèi)型)和對(duì)象:對(duì)象是獨(dú)一無(wú)二的。對(duì)象有其所屬之類(lèi)型。對(duì)象是類(lèi)型的一個(gè)具體的實(shí)例。
創(chuàng)建編寫(xiě)一個(gè) class :定義一個(gè)類(lèi)型。類(lèi)型是編寫(xiě)出來(lái)的,即使程序不運(yùn)行,類(lèi)型已然存在。
對(duì)象:對(duì)象是new出來(lái)的,在程序運(yùn)行期間new出來(lái)的,存在于內(nèi)存中(堆中 )。如果程序未運(yùn)行,則對(duì)象不存在。
對(duì)象的三大特性:
1.封裝
1.1 把本屬于某個(gè)類(lèi)型的成員屬性(靜態(tài)特性)和職責(zé)(動(dòng)態(tài)特性)定義到一個(gè)類(lèi)中。
1.2 訪問(wèn)權(quán)限控制:使用權(quán)限訪問(wèn)修飾符控制成員(屬性和方法)的訪問(wèn)(可見(jiàn)性)。
private:最小訪問(wèn)權(quán)限,僅限類(lèi)的內(nèi)部可以訪問(wèn)。<無(wú)修飾符>:包修飾符,友好訪問(wèn)修飾符,類(lèi)內(nèi),包內(nèi)可以訪問(wèn)。protected:類(lèi)內(nèi),包內(nèi),子類(lèi)可以訪問(wèn)。public:類(lèi)內(nèi),包內(nèi),子類(lèi),包外都可以訪問(wèn)。
類(lèi)的兩大成員:
1.屬性:有默認(rèn)值,0 0.0 false '\0' null。引用類(lèi)型的默認(rèn)值是null值。
2.方法:方法中,可以訪問(wèn)成員屬性。
構(gòu)造方法:
用于構(gòu)造對(duì)象(對(duì)對(duì)象進(jìn)行成員屬性初始化),構(gòu)造對(duì)象的過(guò)程可能簡(jiǎn)單,也可能復(fù)雜。
- 和類(lèi)同名。語(yǔ)法:new 構(gòu)造方法(參數(shù)列表)
- 無(wú)返回值。其作用僅為構(gòu)造對(duì)象。
- 構(gòu)造方法可以重載。
this關(guān)鍵字:
- 訪問(wèn)當(dāng)前對(duì)象的屬性和方法。
- this(參數(shù)列表),只能放在構(gòu)造方法的第一行,并且只能單獨(dú)使用。
- 當(dāng)方法的參數(shù)和成員屬性名稱沖突的時(shí)候,可以使用this進(jìn)行區(qū)分。
2.繼承
2.1 為什么要繼承:消除重復(fù)。子類(lèi)可以繼承父類(lèi)的某些成員。
2.2 extends 關(guān)鍵字:擴(kuò)展。一個(gè)類(lèi)只能繼承一個(gè)父類(lèi)。如果沒(méi)有指定父類(lèi)的話,則默認(rèn)繼承自O(shè)bject類(lèi)。Object類(lèi)是根類(lèi)型,終級(jí)類(lèi),沒(méi)有父類(lèi)。其它一切引用類(lèi)型都是直接或間接繼承自O(shè)bject類(lèi)型。
2.3 什么成員可以被繼承?1. 私有成員不能被繼承。2. 構(gòu)造方法不能被繼承。
2.4 子類(lèi)對(duì)象構(gòu)造的過(guò)程:按照繼承的順序,遞歸創(chuàng)建各類(lèi)型的狀態(tài)值。
3.多態(tài)
同一個(gè)類(lèi)型所展現(xiàn)出的行為或?qū)傩缘亩喾N形態(tài)。
使用父類(lèi)(祖先類(lèi)、接口)的引用指向子類(lèi)(派生類(lèi),實(shí)現(xiàn)類(lèi))的對(duì)象。
多態(tài)的使用場(chǎng)景:某些場(chǎng)景,只希望關(guān)注某些(不同的具體類(lèi)型)類(lèi)型的共性(祖先類(lèi),接口),而忽略其它獨(dú)特的特性。
final:
- 修飾類(lèi),表示類(lèi)不可被繼承。
- 修飾方法,表示方法不能被重寫(xiě)。
- 修飾成員屬性,或者普通變量,表示值不可修改。
static:靜態(tài)的
- 一旦屬性和方法,添加了static關(guān)鍵字,表示屬性和方法是屬于類(lèi)的,而不是屬于某一個(gè)具體的對(duì)象的。
- 通過(guò)“類(lèi)名.靜態(tài)成員”來(lái)訪問(wèn),而無(wú)須先創(chuàng)建對(duì)象。
抽象類(lèi):
- 當(dāng)定義一個(gè)類(lèi)時(shí),如果某個(gè)方法暫時(shí)不便實(shí)現(xiàn),或者無(wú)法實(shí)現(xiàn),或者不適合實(shí)現(xiàn),或者希望具體的子類(lèi)來(lái)提供實(shí)現(xiàn),可以使用abstract關(guān)鍵字來(lái)修飾此方法,表示抽象方法,抽象方法無(wú)需提供實(shí)現(xiàn)。
- 當(dāng)一個(gè)類(lèi)中存在抽象方法時(shí),類(lèi)必須定義成抽象類(lèi)。但是,一個(gè)抽象類(lèi)中可以沒(méi)有抽象方法。
- 抽象類(lèi)不能實(shí)例化,但可以定義構(gòu)造方法。
- 抽象類(lèi)是類(lèi),擁有一切類(lèi)的特性,除了不能實(shí)例化。
接口:
- 接口不是類(lèi)。但是接口和抽象類(lèi)類(lèi)似。
- 接口中的方法全都是公有的抽象方法。jdk8之前。
- 接口中的屬性,都是公有的靜態(tài)的最終的。
- 接口需要類(lèi)來(lái)提供實(shí)現(xiàn)。implements關(guān)鍵字。一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,相當(dāng)于將所有這些接口的方法提供實(shí)現(xiàn)。
- 接口可以繼承接口,使用 extends 關(guān)鍵字。
- 接口也可以使用多態(tài)特性,使用接口的引用指向?qū)崿F(xiàn)類(lèi)的實(shí)例。
- 接口的主要目的(作用)就是多態(tài)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入理解Java中Filter的作用種類(lèi)及應(yīng)用場(chǎng)景
Filter(過(guò)濾器)是Java Web中的一種重要組件,可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行攔截處理,對(duì)數(shù)據(jù)進(jìn)行過(guò)濾和處理。Filter可以實(shí)現(xiàn)許多功能,如:鑒權(quán)、日志記錄、字符編碼轉(zhuǎn)換、數(shù)據(jù)壓縮、請(qǐng)求重定向等等2023-04-04
使用JDBC工具類(lèi)實(shí)現(xiàn)簡(jiǎn)單的登錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了使用JDBC工具類(lèi)實(shí)現(xiàn)簡(jiǎn)單的登錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
SpringMVC源碼解讀之 HandlerMapping - AbstractDetectingUrlHandlerM
這篇文章主要介紹了SpringMVC源碼解讀之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化的相關(guān)資料,需要的朋友可以參考下2016-02-02
詳解jdbc實(shí)現(xiàn)對(duì)CLOB和BLOB數(shù)據(jù)類(lèi)型的操作
這篇文章主要介紹了詳解jdbc實(shí)現(xiàn)對(duì)CLOB和BLOB數(shù)據(jù)類(lèi)型的操作的相關(guān)資料,這里實(shí)現(xiàn)寫(xiě)入操作與讀寫(xiě)操作,需要的朋友可以參考下2017-08-08
Java 處理超大數(shù)類(lèi)型之BigInteger案例詳解
這篇文章主要介紹了Java 處理超大數(shù)類(lèi)型之BigInteger案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
使用Java的Lucene搜索工具對(duì)檢索結(jié)果進(jìn)行分組和分頁(yè)
這篇文章主要介紹了使用Java的搜索工具Lucene對(duì)檢索結(jié)果進(jìn)行分組和分頁(yè)的方法,Luence是Java環(huán)境中的一個(gè)全文檢索引擎工具包,需要的朋友可以參考下2016-03-03
如何使用Collections.reverse對(duì)list集合進(jìn)行降序排序
這篇文章主要介紹了Java使用Collections.reverse對(duì)list集合進(jìn)行降序排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringBoot從yml配置文件中讀常用參數(shù)值實(shí)例方法
在本篇文章里小編給大家整理了關(guān)于SpringBoot從yml配置文件中讀常用參數(shù)值實(shí)例方法,有需要的朋友們學(xué)習(xí)下。2019-12-12

