溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在Java中使用super關(guān)鍵字調(diào)用父類(lèi)

發(fā)布時(shí)間:2021-06-11 16:16:27 來(lái)源:億速云 閱讀:575 作者:Leah 欄目:編程語(yǔ)言

今天就跟大家聊聊有關(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è)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI