JavaSE面試題之this與super關(guān)鍵字的區(qū)別詳解
1.0 this 與 super 關(guān)鍵字的區(qū)別
1.1 在Java中,this 關(guān)鍵字有以下作用
一、用于指代當(dāng)前對(duì)象的引用,可以在類(lèi)的方法中使用 this 來(lái)訪問(wèn)當(dāng)前對(duì)象的成員變量和方法。
二、用于區(qū)分局部變量和成員變量,當(dāng)局部變量和成員變量同名時(shí),使用 this 關(guān)鍵字可以明確指定使用成員變量。
代碼如下:
public class Problem2 { public static void main(String[] args) { C c = new C(2); System.out.println(c.getX()); } } class C { private int x; public C(int x) { //此處 this 的引用場(chǎng)景 this.x = x; } public int getX(){ return x; } }
三、用于在構(gòu)造方法中調(diào)用其他構(gòu)造方法,可以使用 this 關(guān)鍵字來(lái)調(diào)用同一個(gè)類(lèi)中的其他構(gòu)造方法。
代碼如下:
public class Problem2 { public static void main(String[] args) { //使用了無(wú)參構(gòu)造器 C c = new C(); System.out.println(c.getX()); } } class C { private int x; public C(int x) { //此處 this 的引用場(chǎng)景 this.x = x; } //可以用無(wú)參構(gòu)造器來(lái)直接調(diào)用兄弟構(gòu)造器 public C() { this(2); } public int getX(){ return x; } }
1.2 在Java中,super 關(guān)鍵字有以下作用
一、用于訪問(wèn)父類(lèi)的成員變量或方法:在子類(lèi)中,可以使用 super 關(guān)鍵字來(lái)訪問(wèn)父類(lèi)中的成員變量或方法,即使子類(lèi)中有同名的成員變量或方法,也可以通過(guò) super 來(lái)訪問(wèn)父類(lèi)的成員。
簡(jiǎn)單來(lái)說(shuō),假如子類(lèi)與父類(lèi)中沒(méi)用同名的成員變量或者方法,用 this 關(guān)鍵字就可以去訪問(wèn)到父類(lèi)還有子類(lèi)的成員變量或者方法;假如子類(lèi)與父類(lèi)中有同名的成員變量或者方法,訪問(wèn)父類(lèi)的同名的變量或者方法就需要用到 super 關(guān)鍵字了,總的來(lái)說(shuō),用 this 可以訪問(wèn)到父類(lèi)與子類(lèi)的成員變量與方法,如果存在同名就要另談了。super 就能訪問(wèn)到父類(lèi)的成員變量與方法。
代碼如下:
class p { public String name = "李四"; public int age = 10; } public class Problem3 extends p { //假如子類(lèi)存在與父類(lèi)同名, //則我們想去訪問(wèn)父類(lèi)的 name 就需要用到關(guān)鍵字 super 了。 public String name = "王五"; public void fun() { //根據(jù)就近原則,這就只能訪問(wèn)到當(dāng)前子類(lèi)的 name System.out.println(name); //用上關(guān)鍵字 super 可以訪問(wèn)到父類(lèi)的 name System.out.println(super.name); //由于子類(lèi)中沒(méi)有與父類(lèi)中的 age 同名, // 所以,可以用 this 關(guān)鍵字,甚至可以不用。 //目前這三種的效果是一樣的 System.out.println(age); System.out.println(this.age); System.out.println(super.age); } public static void main(String[] args) { Problem3 problem3 = new Problem3(); problem3.fun(); } }
運(yùn)行結(jié)果如下:
二、用于調(diào)用父類(lèi)的構(gòu)造方法:在子類(lèi)的構(gòu)造方法中,可以使用 super 關(guān)鍵字來(lái)調(diào)用父類(lèi)的構(gòu)造方法,以初始化父類(lèi)的成員變量或執(zhí)行父類(lèi)的初始化操作。(重點(diǎn))
用子類(lèi)用創(chuàng)建對(duì)象的時(shí)候,先要調(diào)用父類(lèi)的實(shí)例,再執(zhí)行父類(lèi)的構(gòu)造,再到子類(lèi)的實(shí)例,再執(zhí)行子類(lèi)的構(gòu)造器。當(dāng)然如果存在靜態(tài)變量或者方法,必定是先執(zhí)行靜態(tài)的變量或者方法,先父類(lèi)的再到子類(lèi)的。
代碼如下:
public class Problem4 { public static void main(String[] args) { Son son = new Son(4); } } class Son extends Father { static { System.out.println("son::static"); } { System.out.println("son::實(shí)例"); } public Son(int age) { super(age); System.out.println("son::構(gòu)造器"); } } class Father { public static String name; public int age = 1; static { System.out.println("father::static"); } { System.out.println("father::實(shí)例"); } public Father(int age) { this.age = age; System.out.println("father::構(gòu)造器"); } }
運(yùn)行結(jié)果如下:
需要注意的是,實(shí)例代碼塊指的是沒(méi)有 static 修飾,必須放在類(lèi)下。與對(duì)象初始化一起加載,即每次調(diào)用構(gòu)造方法都會(huì)執(zhí)行,并且在構(gòu)造方法前執(zhí)行。
實(shí)例指是是什么呢?
實(shí)例指是指在面向?qū)ο缶幊讨?,?lèi)的一個(gè)具體對(duì)象。當(dāng)一個(gè)類(lèi)被實(shí)例化(創(chuàng)建對(duì)象)時(shí),就會(huì)產(chǎn)生一個(gè)該類(lèi)的實(shí)例。這個(gè)實(shí)例擁有類(lèi)定義的屬性和方法,可以在程序中被調(diào)用和操作。實(shí)例化一個(gè)類(lèi)就是創(chuàng)建該類(lèi)的一個(gè)對(duì)象。例如,如果有一個(gè)叫做 Car 的類(lèi),那么當(dāng)創(chuàng)建一個(gè)特定的 Car 對(duì)象時(shí),這個(gè)對(duì)象就是 Car 類(lèi)的一個(gè)實(shí)例。
小結(jié):用子類(lèi)來(lái)創(chuàng)建對(duì)象的時(shí)候,代碼的執(zhí)行順序?yàn)椋盒枰劝迅割?lèi)靜態(tài)成員變量、方法執(zhí)行,再到子類(lèi)的靜態(tài)的成員變量、方法。再執(zhí)行父類(lèi)的實(shí)例(實(shí)例可以簡(jiǎn)單粗暴的理解為賦值),父類(lèi)的構(gòu)造器,最后到子類(lèi)的實(shí)例、子類(lèi)的構(gòu)造器。需要注意的是靜態(tài)成員變量、方法只會(huì)調(diào)用一次。(可以把以上的代碼賦值到編譯器中一步步來(lái)調(diào)試,看看代碼執(zhí)行的順序)
三、用于在子類(lèi)中調(diào)用父類(lèi)的構(gòu)造方法時(shí),super() 必須是子類(lèi)構(gòu)造器中的第一條語(yǔ)句。
代碼如下:
同樣的,this() 也必須是構(gòu)造器器中的第一條語(yǔ)句,因此,this() 與 super() 不能同時(shí)出現(xiàn)。
2.0 經(jīng)典習(xí)題
如下的代碼最終的輸出結(jié)果是什么?
代碼如下:
class X{ int b = 10; int a = 10; public X(){//2 System.out.print("X"); } Y y=new Y();//1 } class Y{ public Y(){//3 System.out.print("Y"); } } public class Z extends X{ Y y=new Y();//4 public Z(){//5 System.out.print("Z"); } public static void main(String[] args) { new Z(); } }
詳細(xì)對(duì)以上代碼進(jìn)行分析:當(dāng) new Z() 用子類(lèi)對(duì)創(chuàng)建對(duì)象時(shí),先會(huì)執(zhí)行父類(lèi)靜態(tài)的成員變量、方法,到子類(lèi)的靜態(tài)成員變量、方法。當(dāng)然這里沒(méi)有出現(xiàn)相關(guān)的靜態(tài)成員變量、方法。接著到父類(lèi)的實(shí)例為:Y y=new Y();//1 再到父類(lèi)的構(gòu)造方法,最后到子類(lèi)的實(shí)例為:Y y=new Y();//4 再到子類(lèi)的構(gòu)造方法。
總的來(lái)說(shuō),在繼承層次上,先執(zhí)行父類(lèi)和子類(lèi)的靜態(tài)的,再執(zhí)行父類(lèi)的實(shí)例,父類(lèi)的構(gòu)造,最后執(zhí)行子類(lèi)的實(shí)例和子類(lèi)的構(gòu)造。沒(méi)有靜態(tài)的。所以先執(zhí)行1和2,再執(zhí)行4和5。執(zhí)行注釋1和注釋4的時(shí)候,分班打印Y。故最終的結(jié)果是YXYZ。
運(yùn)行結(jié)果為:
總結(jié)
到此這篇關(guān)于JavaSE面試題之this與super關(guān)鍵字區(qū)別詳解的文章就介紹到這了,更多相關(guān)JavaSE this與super關(guān)鍵字區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中this與super關(guān)鍵字的使用方法
- Java中的構(gòu)造方法this、super的用法詳解
- java基礎(chǔ)知識(shí) super和this使用解析
- Java this super代碼實(shí)例及使用方法總結(jié)
- Java中super和this的用法詳解
- 關(guān)于java關(guān)鍵字this和super的區(qū)別和理解
- Java中超詳細(xì)this與super的概念和用法
- Java 中的 this 和 super 區(qū)別
- Java關(guān)鍵字this與super詳解用法
- Java中super和this關(guān)鍵字詳解
- Java中this和super關(guān)鍵字的使用詳解
- Java中 this和super的用法與區(qū)別小結(jié)
相關(guān)文章
新手入門(mén)Jvm-- JVM對(duì)象創(chuàng)建與內(nèi)存分配機(jī)制
JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫(xiě),JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的2021-06-06logback標(biāo)記日志過(guò)濾器MarkerFilter源碼解讀
這篇文章主要為大家介紹了logback標(biāo)記日志過(guò)濾器MarkerFilter源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段
這篇文章主要介紹了Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段,我們將重點(diǎn)關(guān)注兩種不同的方法,以展示框架的多功能性以及我們可以使用它的靈活方式。 需要的朋友可以參考下2019-05-05Java設(shè)計(jì)模式七大原則之開(kāi)閉原則詳解
開(kāi)閉原則,又稱為OCP原則,即一個(gè)軟件實(shí)體如類(lèi),模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。本文將詳細(xì)介紹Java設(shè)計(jì)模式七大原則之一的開(kāi)閉原則,需要的可以參考一下2022-02-02參數(shù)校驗(yàn)Spring的@Valid注解用法解析
這篇文章主要介紹了參數(shù)校驗(yàn)Spring的@Valid注解用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08解決java調(diào)用dll報(bào)Unable to load library錯(cuò)誤的問(wèn)題
這篇文章主要介紹了解決java調(diào)用dll報(bào)Unable to load library錯(cuò)誤的問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11完美解決SpringCloud-OpenFeign使用okhttp替換不生效問(wèn)題
這篇文章主要介紹了完美解決SpringCloud-OpenFeign使用okhttp替換不生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02