您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)怎么在Java中使用super關(guān)鍵字調(diào)用父類(lèi),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
package com.my.pac14; /** * @auther Summerday */ public class SuperTest { public static void main(String[] args) { SubClass sb = new SubClass(20); //創(chuàng)建子類(lèi)的對(duì)象,調(diào)用子類(lèi)的print方法 sb.print(); } } class BaseClass { public int a = 5; public int b; static public int c = 30; BaseClass(int b) { this.b = b; System.out.println("superb:" + this.b); } public void print() { System.out.println("父類(lèi)的a = " + a); //System.out.println(this.a); } public void read() { System.out.println("read.."); } } class SubClass extends BaseClass { public int a = 10; //子類(lèi)中的實(shí)例變量將父類(lèi)中的隱藏,所以下面的this.b=0 public int b; static public int c = 40; SubClass(int b) { //調(diào)用父類(lèi)的構(gòu)造器 super(b);//20 System.out.println("superb:" + super.b + ",subb:" + this.b);//0 } public void print() { //打印父類(lèi)中的a=5 System.out.println(super.a);//5 //調(diào)用父類(lèi)的print方法,打印a=5 super.print();//5 //直接打印a,會(huì)打印出當(dāng)前類(lèi)的a,打印子類(lèi)的a=10 System.out.println("子類(lèi)的a = " + a); //類(lèi)變量也會(huì)覆蓋 System.out.println(c); //用父類(lèi)名訪問(wèn)父類(lèi)的類(lèi)變量 System.out.println("父類(lèi)中的類(lèi)變量c = " + BaseClass.c); //沒(méi)有重寫(xiě),不需要使用super調(diào)用父類(lèi)方法 read(); } }
super用于限定該對(duì)象調(diào)用從父類(lèi)繼承得到的實(shí)例變量或方法,因此和this相同的是,super不能出現(xiàn)在static修飾的方法中。(因?yàn)閟tatic修飾的方法屬于類(lèi),調(diào)用者將會(huì)是類(lèi),而不是一個(gè)對(duì)象)
調(diào)用父類(lèi)成員變量
實(shí)例變量
可以直接利用super.xx限定訪問(wèn)父類(lèi)的實(shí)例變量。
//父類(lèi) public int a = 5; //子類(lèi) public int a = 10; //在子類(lèi)中訪問(wèn)父類(lèi)的實(shí)例變量 public void print() { //打印父類(lèi)中的a=5 System.out.println(super.a);//5 //直接打印a,會(huì)打印出當(dāng)前類(lèi)的a,打印子類(lèi)的a=10 System.out.println("子類(lèi)的a = " + a); }
類(lèi)變量
如果父類(lèi)變量是用static修飾的類(lèi)變量,則需要用父類(lèi)類(lèi)名.xx限定訪問(wèn)其類(lèi)變量。(雖然可以使用super訪問(wèn)父類(lèi)中的類(lèi)變量,就像我們之前說(shuō)的用類(lèi)的實(shí)例訪問(wèn)類(lèi)變量,但是極不規(guī)范,不建議。)
//父類(lèi) static public int c = 30; //子類(lèi) static public int c = 40; //在子類(lèi)中訪問(wèn)父類(lèi)的類(lèi)變量 public void print() { //類(lèi)變量也會(huì)隱藏 System.out.println(c); //用父類(lèi)名訪問(wèn)父類(lèi)的類(lèi)變量 System.out.println("父類(lèi)中的類(lèi)變量c = " + BaseClass.c); }
總結(jié):
子類(lèi)中沒(méi)有包含和父類(lèi)同名的成員變量,就無(wú)需使用super或父類(lèi)名顯式調(diào)用。
如果在沒(méi)夠方法中訪問(wèn)某成員變量,但沒(méi)有顯式指定調(diào)用者,則查找該成員變量的順序:
查找該方法中有沒(méi)有。
查找該類(lèi)中有沒(méi)有。
查找父類(lèi)中有沒(méi)有。
……
如果沒(méi)有找到,就會(huì)報(bào)錯(cuò)。
當(dāng)創(chuàng)建一個(gè)子類(lèi)對(duì)象時(shí),系統(tǒng)不僅會(huì)為該類(lèi)中定義的實(shí)例變量分配內(nèi)存,也會(huì)為它從父類(lèi)繼承得到的所有實(shí)例變量分配內(nèi)存,即使子類(lèi)定義了與父類(lèi)中同名的實(shí)例變量。所以,子類(lèi)中定義與父類(lèi)同名的實(shí)例變量并不會(huì)完全覆蓋父類(lèi)中定義的實(shí)例變量,只是簡(jiǎn)單地隱藏。
調(diào)用父類(lèi)的方法
我們之前說(shuō)過(guò),子類(lèi)中定義與父類(lèi)同名且參數(shù)列表相同的實(shí)例方法(static方法不能被重寫(xiě))就是所謂的方法重寫(xiě),此時(shí)子類(lèi)的方法會(huì)覆蓋父類(lèi)的方法。
在子類(lèi)中想調(diào)用父類(lèi)的同名實(shí)例方法,可以利用:super.父類(lèi)方法名;
如果是類(lèi)方法,則可以用父類(lèi)名.父類(lèi)方法名調(diào)用。(super依舊可以,但不建議)
如果沒(méi)有同名,就不需要顯式用super調(diào)用父類(lèi)方法。
//父類(lèi) public void print() { System.out.println("父類(lèi)的a = " + a); //System.out.println(this.a); } public void read() { System.out.println("read.."); } //子類(lèi) public void print() { //調(diào)用父類(lèi)的print方法,打印a=5 super.print();//5 //沒(méi)有重寫(xiě),不需要使用super調(diào)用父類(lèi)方法 read(); }
看完上述內(nèi)容,你們對(duì)怎么在Java中使用super關(guān)鍵字調(diào)用父類(lèi)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。