Java方法的覆蓋與隱藏的區(qū)別分析
關(guān)于隱藏和覆蓋的區(qū)別,要提到RTTI(run-time type identification)(運(yùn)行期類(lèi)型檢查),也就是運(yùn)行期的多態(tài),當(dāng)一個(gè)父類(lèi)引用指向子類(lèi)對(duì)象的時(shí)候,請(qǐng)看下面我編寫(xiě)的一段代碼:
public class RunTime {
public static void main(String[] args) {
Animal a = new Cat();
System.out.println(a.A);
System.out.println(a.b);
a.voice();
a.method();
}
}
class Dog extends Animal {
public int b = 3;
public static int A = 3;
public static void method(){
System.out.println("狗");
}
public void voice() {
System.out.println("狗叫");
}
}
class Cat extends Animal {
public int b = 4;
public static int A = 4;
public static void method(){
System.out.println("貓");
}
public void voice() {
System.out.println("貓叫");
}
}
class Animal {
public int b = 0;
public static int A = 0;
public static void method(){
System.out.println("動(dòng)物");
}
public void voice() {
System.out.println("動(dòng)物叫");
}
}
輸出結(jié)果是:
0
0
貓叫
動(dòng)物
您可以看到,當(dāng)父類(lèi)Animal的引用a指向子類(lèi)Dog時(shí),RTTI在運(yùn)行期會(huì)自動(dòng)確定該引用的真是類(lèi)型,當(dāng)子類(lèi) 覆蓋 了父類(lèi)的方法時(shí),則直接調(diào)用子類(lèi)的方法,打印出“貓叫”;然而非靜態(tài)的方法在子類(lèi)中重寫(xiě)的話(huà)就是被覆蓋,而靜態(tài)的方法被子類(lèi)重寫(xiě)的話(huà)就是隱藏,另外,靜態(tài)變量和成員變量也是被隱藏,而RTTI是只針對(duì)覆蓋,不針對(duì)影藏,所以,靜態(tài)變量 A 和 非靜態(tài)變量 b 以及靜態(tài)方法method() 均不通過(guò)RTTI,是哪個(gè)類(lèi)的引用就調(diào)用誰(shuí)的靜態(tài)方法,成員變量,而這里是父類(lèi)Animal的引用,所以直接調(diào)用父類(lèi)Animal中的方法以及成員變量。所以靜態(tài)方法 method(), 靜態(tài)變量 A 和成員變量 b 打印結(jié)果全是父類(lèi)中的。只用被覆蓋的非靜態(tài)方法voice()才打印子類(lèi)的。
相關(guān)文章
springboot整合mail實(shí)現(xiàn)郵箱的發(fā)送功能
本文分步驟給大家介紹springboot整合mail實(shí)現(xiàn)郵箱的發(fā)送功能,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-09-09
kotlin快速入門(mén)之標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法
學(xué)完了Kotlin的基礎(chǔ)知識(shí),是時(shí)候來(lái)來(lái)學(xué)習(xí) Kotlin的標(biāo)準(zhǔn)函數(shù)和靜態(tài)方法了,下面這篇文章主要給大家介紹了關(guān)于kotlin快速入門(mén)之標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
Java中的HashMap和Hashtable區(qū)別解析
這篇文章主要介紹了Java中的HashMap和Hashtable區(qū)別解析,HashMap和Hashtable都實(shí)現(xiàn)了Map接口,但決定用哪一個(gè)之前先要弄清楚它們之間的區(qū)別,主要的區(qū)別有線(xiàn)程安全性、同步和速度,需要的朋友可以參考下2023-11-11
spring初始化源碼之關(guān)鍵類(lèi)和擴(kuò)展接口詳解
Spring就是一個(gè)大工廠(chǎng),可以將所有對(duì)象的創(chuàng)建和依賴(lài)關(guān)系的維護(hù)交給Spring管理,下面這篇文章主要給大家介紹了關(guān)于spring初始化源碼之關(guān)鍵類(lèi)和擴(kuò)展接口的相關(guān)資料,需要的朋友可以參考下2023-04-04
java注解之運(yùn)行時(shí)修改字段的注解值操作
這篇文章主要介紹了java注解之運(yùn)行時(shí)修改字段的注解值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Spring?Boot?整合持久層之Spring Data JPA
在介紹Spring Data JPA的時(shí)候,我們首先認(rèn)識(shí)下Hibernate。Hibernate是數(shù)據(jù)訪(fǎng)問(wèn)解決技術(shù)的絕對(duì)霸主,使用O/R映射技術(shù)實(shí)現(xiàn)數(shù)據(jù)訪(fǎng)問(wèn),O/R映射即將領(lǐng)域模型類(lèi)和數(shù)據(jù)庫(kù)的表進(jìn)行映射,通過(guò)程序操作對(duì)象而實(shí)現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪(fǎng)問(wèn)操作無(wú)須關(guān)注數(shù)據(jù)庫(kù)相關(guān)的技術(shù)2022-08-08

