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