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

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

java對象的三個特性(封裝、繼承、多態(tài))
類(類型)和對象:對象是獨一無二的。對象有其所屬之類型。對象是類型的一個具體的實例。
創(chuàng)建編寫一個 class :定義一個類型。類型是編寫出來的,即使程序不運行,類型已然存在。
對象:對象是new出來的,在程序運行期間new出來的,存在于內(nèi)存中(堆中 )。如果程序未運行,則對象不存在。
對象的三大特性:
1.封裝
1.1 把本屬于某個類型的成員屬性(靜態(tài)特性)和職責(動態(tài)特性)定義到一個類中。
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.屬性:有默認值,0 0.0 false '\0' null。引用類型的默認值是null值。
2.方法:方法中,可以訪問成員屬性。
構(gòu)造方法:
用于構(gòu)造對象(對對象進行成員屬性初始化),構(gòu)造對象的過程可能簡單,也可能復雜。
- 和類同名。語法:new 構(gòu)造方法(參數(shù)列表)
- 無返回值。其作用僅為構(gòu)造對象。
- 構(gòu)造方法可以重載。
this關(guān)鍵字:
- 訪問當前對象的屬性和方法。
- this(參數(shù)列表),只能放在構(gòu)造方法的第一行,并且只能單獨使用。
- 當方法的參數(shù)和成員屬性名稱沖突的時候,可以使用this進行區(qū)分。
2.繼承
2.1 為什么要繼承:消除重復。子類可以繼承父類的某些成員。
2.2 extends 關(guān)鍵字:擴展。一個類只能繼承一個父類。如果沒有指定父類的話,則默認繼承自O(shè)bject類。Object類是根類型,終級類,沒有父類。其它一切引用類型都是直接或間接繼承自O(shè)bject類型。
2.3 什么成員可以被繼承?1. 私有成員不能被繼承。2. 構(gòu)造方法不能被繼承。
2.4 子類對象構(gòu)造的過程:按照繼承的順序,遞歸創(chuàng)建各類型的狀態(tài)值。
3.多態(tài)
同一個類型所展現(xiàn)出的行為或?qū)傩缘亩喾N形態(tài)。
使用父類(祖先類、接口)的引用指向子類(派生類,實現(xiàn)類)的對象。
多態(tài)的使用場景:某些場景,只希望關(guān)注某些(不同的具體類型)類型的共性(祖先類,接口),而忽略其它獨特的特性。
final:
- 修飾類,表示類不可被繼承。
- 修飾方法,表示方法不能被重寫。
- 修飾成員屬性,或者普通變量,表示值不可修改。
static:靜態(tài)的
- 一旦屬性和方法,添加了static關(guān)鍵字,表示屬性和方法是屬于類的,而不是屬于某一個具體的對象的。
- 通過“類名.靜態(tài)成員”來訪問,而無須先創(chuàng)建對象。
抽象類:
- 當定義一個類時,如果某個方法暫時不便實現(xiàn),或者無法實現(xiàn),或者不適合實現(xiàn),或者希望具體的子類來提供實現(xiàn),可以使用abstract關(guān)鍵字來修飾此方法,表示抽象方法,抽象方法無需提供實現(xiàn)。
- 當一個類中存在抽象方法時,類必須定義成抽象類。但是,一個抽象類中可以沒有抽象方法。
- 抽象類不能實例化,但可以定義構(gòu)造方法。
- 抽象類是類,擁有一切類的特性,除了不能實例化。
接口:
- 接口不是類。但是接口和抽象類類似。
- 接口中的方法全都是公有的抽象方法。jdk8之前。
- 接口中的屬性,都是公有的靜態(tài)的最終的。
- 接口需要類來提供實現(xiàn)。implements關(guān)鍵字。一個類可以實現(xiàn)多個接口,相當于將所有這些接口的方法提供實現(xiàn)。
- 接口可以繼承接口,使用 extends 關(guān)鍵字。
- 接口也可以使用多態(tài)特性,使用接口的引用指向?qū)崿F(xiàn)類的實例。
- 接口的主要目的(作用)就是多態(tài)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java有趣好玩的圖形界面開發(fā)八個案例實現(xiàn)
今天使用GUI技術(shù)寫了幾個練習的Demo,希望對大家學習圖形用戶界面有所幫助,感興趣的同學來看看吧,動手敲一遍理解更通透2022-05-05
2022年最新java?8?(?jdk1.8u321)安裝圖文教程
這篇文章主要介紹了2022年最新java?8?(?jdk1.8u321)安裝圖文教程,截止2022年1月,官方出的jdk1.8目前已更新到8u321的版本,本文通過圖文并茂的形式給大家介紹安裝過程,需要的朋友可以參考下2022-08-08
實現(xiàn)一個基于Servlet的hello world程序詳解步驟
Java Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數(shù)據(jù)庫或應用程序之間的中間層2022-02-02
淺析Java?NIO?直接緩沖區(qū)和非直接緩沖區(qū)
本篇文章主要為大家介紹了Java?NIO?中直接緩沖區(qū)和非直接緩沖區(qū)的定義以及使用流程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11
Java 實戰(zhàn)項目之教材管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)教材管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11

