您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Java中super關鍵字的用法和細節是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
1. 簡單,只需理解基本的概念,就可以編寫適合于各種情況的應用程序;2. 面向對象;3. 分布性,Java是面向網絡的語言;4. 魯棒性,java提供自動垃圾收集來進行內存管理,防止程序員在管理內存時容易產生的錯誤。;5. 安全性,用于網絡、分布環境下的Java必須防止病毒的入侵。6. 體系結構中立,只要安裝了Java運行時系統,就可在任意處理器上運行。7. 可移植性,Java可以方便地移植到網絡上的不同機器。8.解釋執行,Java解釋器直接對Java字節碼進行解釋執行。
最近在復習前面學過的知識的時候發現,自己在初學面向對象時對Super關鍵字的理解不夠深刻,所以現在重新學習一下super關鍵字的用法和細節。
在Java中,super關鍵字共有三種用法,分別是:
通過 super.屬性名 來訪問父類中的成員變量
通過super.方法名(參數列表) 來訪問父類中的成員方法
通過super(參數列表) 來訪問父類的構造方法
調用父類的成員變量:
class Person { protected int age; } class Student extends Person{ public void func(){ int age = super.age; //通過super.屬性名訪問父類的成員變量 } }
調用父類中的成員方法:
class Person { protected void func(){ } } class Student extends Person{ public void func(){ super.func(); //通過super.方法名調用父類的成員方法 } }
調用父類的構造器:
class Person { String name; public Person(String name) { this.name = name; } } class Student extends Person{ public Student(String name) { super(name); //通過super(參數列表)調用父類的構造方法 } }
注意:
子類無法通過super關鍵字訪問父類中private修飾的屬性和方法,因為private修飾的屬性和方法只能在當前類的內部進行訪問在子類的構造器中通過super關鍵字調用父類的構造器時,super關鍵字必須出現在構造器的第一行且僅能出現一次
當我們查找子類中的方法時,調用規則如下:
當子類中存在需要調用的方法時,直接調用即可如果子類中不存在該方法,則向上尋找父類,如果父類中存在該方法,則調用父類中的方法若父類中不存在該方法,那么向上尋找父類的父類,直到找到Object類
提示:如果直到Object類依然沒有找到該方法,那么會提示方法不存在,但如果向上找到了這個方法但沒有權限訪問(例如該方法被private修飾),則會產生錯誤。
public class Test extends Test2{ public static void main(String[] args) { Test test = new Test(); test.func1(); } public void func1(){ System.out.println("子類中的func1()"); func2(); } } class Test2{ public void func2(){ System.out.println("父類中的func2()"); } } //結果: 子類中的func1() 父類中的func2()
在上述代碼中,子類中的func1()方法在調用func2()方法時會在子類中查找是否存在func2()方法,未找到時會在其父類中查找func2()方法。
當我們將func1()中的語句 func2(); 改為 this.func2(); 此時語義未發生改變,依然會先在子類中查找,沒有找到時會在其父類中查找。
當我們再將 this.func2(); 改為 super.func2(); 這時語義就發生了變化,上面提到過,super.方法名()調用的是父類中的方法,那么這條語句就不會檢測當前類中是否存在func2()方法,只會在其父類中依次向上進行檢測。例如:
public class Test extends Test2{ public static void main(String[] args) { Test test = new Test(); test.func1(); } public void func1(){ System.out.println("子類中的func1()"); super.func2(); //這里編譯無法通過 } public void func2(){ System.out.println("字類中的func2()"); } } class Test2{ public void func3(){ System.out.println("父類中的func3()"); } } //編譯未通過,提示無法解析Test2中的方法func2()
注:成員屬性與成員方法同理。
我們已經知道了,super關鍵字的訪問并不僅僅局限于父類,即使是父類的父類,父類的父類的父類,甚至再往上,都可以通過super關鍵字訪問到。那么,如果子類上面的多個類中都存在同樣的成員,此時使用super關鍵字訪問的是哪個類中的成員呢?
當子類要訪問上級類的某個成員,而子類的多個上級類都有該成員時,我們對super關鍵字的使用采用就近原則,也就是訪問super關鍵字向上找到的第一個成員。例如:
public class Test extends Test2{ public static void main(String[] args) { Test test = new Test(); test.func1(); } public void func1(){ System.out.println("子類中的func1()"); super.func2(); //子類通過super關鍵字訪問上級類中的func2() } } class Test2 extends Test3{ public void func2(){ System.out.println("父類中的func2()"); } } class Test3{ public void func2(){ System.out.println("父類的父類中的func2()"); } } //結果: 子類中的func1() 父類中的func2()
在上述代碼中,子類通過super關鍵字訪問上級類中的func2()方法,子類繼承Test2,Test2繼承Test3,此時Test2和Test3中都存在func2(),此時子類先訪問其父類Test2,Test2中存在func2()方法,那么直接訪問Test2中的func2()即可,若Test2中不存在func2(),則super關鍵字會繼續向上訪問。
下面這個表格列出了super關鍵字和this關鍵字的區別:
關于Java中super關鍵字的用法和細節是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。