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