1. 程式人生 > 程式設計 >Java super關鍵字呼叫父類過程解析

Java super關鍵字呼叫父類過程解析

這篇文章主要介紹了Java super關鍵字呼叫父類過程解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

話不多說,直接上程式碼:

package com.my.pac14;

/**
 * @auther Summerday
 */
public class SuperTest {
  public static void main(String[] args) {
    SubClass sb = new SubClass(20);
    //建立子類的物件,呼叫子類的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("父類的a = " + a);
    //System.out.println(this.a);
  }

  public void read() {
    System.out.println("read..");
  }
}

class SubClass extends BaseClass {
  public int a = 10;
  //子類中的例項變數將父類中的隱藏,所以下面的this.b=0
  public int b;
  static public int c = 40;
  
  SubClass(int b) {
  //呼叫父類的構造器
    super(b);//20
    System.out.println("superb:" + super.b + ",subb:" + this.b);//0
  }

  public void print() {
    //列印父類中的a=5
    System.out.println(super.a);//5
    //呼叫父類的print方法,列印a=5
    super.print();//5
    //直接列印a,會打印出當前類的a,列印子類的a=10
    System.out.println("子類的a = " + a);
    //類變數也會覆蓋
    System.out.println(c);
    //用父類名訪問父類的類變數
    System.out.println("父類中的類變數c = " + BaseClass.c);
    //沒有重寫,不需要使用super呼叫父類方法
    read();
  }

}

super用於限定該物件呼叫從父類繼承得到的例項變數或方法,因此和this相同的是,super不能出現在static修飾的方法中。(因為static修飾的方法屬於類,呼叫者將會是類,而不是一個物件)

呼叫父類成員變數

例項變數

可以直接利用super.xx限定訪問父類的例項變數。

//父類
public int a = 5;
//子類
public int a = 10;
//在子類中訪問父類的例項變數
public void print() {
  //列印父類中的a=5
  System.out.println(super.a);//5
  //直接列印a,會打印出當前類的a,列印子類的a=10
  System.out.println("子類的a = " + a);
}

類變數

如果父類變數是用static修飾的類變數,則需要用父類類名.xx限定訪問其類變數。(雖然可以使用super訪問父類中的類變數,就像我們之前說的用類的例項訪問類變數,但是極不規範,不建議。)

//父類
static public int c = 30;
//子類
static public int c = 40;
//在子類中訪問父類的類變數
public void print() {
  //類變數也會隱藏
  System.out.println(c);
  //用父類名訪問父類的類變數
  System.out.println("父類中的類變數c = " + BaseClass.c);
} 

總結:

  • 子類中沒有包含和父類同名的成員變數,就無需使用super或父類名顯式呼叫。
  • 如果在沒夠方法中訪問某成員變數,但沒有顯式指定呼叫者,則查詢該成員變數的順序:
    • 查詢該方法中有沒有。
    • 查詢該類中有沒有。
    • 查詢父類中有沒有。
    • ……
  • 如果沒有找到,就會報錯。

當建立一個子類物件時,系統不僅會為該類中定義的例項變數分配記憶體,也會為它從父類繼承得到的所有例項變數分配記憶體,即使子類定義了與父類中同名的例項變數。所以,子類中定義與父類同名的例項變數並不會完全覆蓋父類中定義的例項變數,只是簡單地隱藏。

呼叫父類的方法

我們之前說過,子類中定義與父類同名且引數列表相同的例項方法(static方法不能被重寫)就是所謂的方法重寫,此時子類的方法會覆蓋父類的方法。

  • 在子類中想呼叫父類的同名例項方法,可以利用:super.父類方法名;
  • 如果是類方法,則可以用父類名.父類方法名呼叫。(super依舊可以,但不建議)
  • 如果沒有同名,就不需要顯式用super呼叫父類方法。
//父類
public void print() {
  System.out.println("父類的a = " + a);
  //System.out.println(this.a);
}
public void read() {
  System.out.println("read..");
}
//子類
 public void print() {
  //呼叫父類的print方法,列印a=5
  super.print();//5
  //沒有重寫,不需要使用super呼叫父類方法
  read();
}

呼叫父類構造器

關於子類中利用super關鍵字呼叫父類構造器,在上一篇中,已經做出總結,具體可參看:Java繼承構造器使用過程解析

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。