首頁  >  文章  >  Java  >  Java中關於super關鍵字的使用詳解

Java中關於super關鍵字的使用詳解

黄舟
黄舟原創
2017-10-14 09:35:071830瀏覽

這篇文章主要介紹了Java super關鍵字的使用方法詳解的相關資料,希望透過本文能幫助到大家,讓大家對super關鍵字徹底掌握,需要的朋友可以參考下

建構方法中的super關鍵字

在Java子類別的建構方法中可以透過super關鍵字來呼叫父類別的建構方法。其用法為:

1) super(); 存取父類別中的無參構造函數

2) super (paras…); 存取父類別中的成員函數yyy

super()來呼叫父類別無參的建構方法,但即使不使用super(),預設也會呼叫父類別無參的建構方法。父類無參的建構方法可以是自訂的無參構造方法,也可以是編譯器自動產生的預設建構方法。但如果在父類別中定義了有參的建構方法,但沒有定義無參的建構方法,這時編譯器不會產生預設建構函數,也不能透過super()來呼叫建構方法。此外,如果父類別中定義了private的無參構造方法,也不同透過super()來呼叫。

super(paras…);用來呼叫父類別中某個有參的建構方法。

super呼叫父類別的建構方法,必須放在子類別建構方法的第一行中執行。如果呼叫的有參的父類別建構方法,在super的參數中不能用子類別中的非static成員變數(可以使用static成員變量,因為static成員變數在建構方法執行前就已經初始化),也不能使用this或super的相關調用。例如super(super.getClass().getName());

在建構方法中也可以使用super關鍵字來存取父類別中的成員變數和成員函數。其用法和非建構方法中的super關鍵字用法相同。

非建構方法中的super關鍵字

在Java子類別中可以透過super關鍵字來呼叫父類別中的成員變數和方法。其用法為。

1) super.xxx; 存取父類別中的成員變數xxx
2) super.yyy(paras…); 存取父類別中的成員函數yyy

super關鍵字存取父類別的成員變數和成員函數時不能越過存取權限的控制,不能存取父類別中private的成員變數和方法。例如:


class a {
  private int mNum = 0;
}
class b extends a {
  public void setNum(int i) {
    super.mNum = i;   //错误,不能访问父类的private成员
  }
}

當有多層的繼承關係時,super呼叫只能自身父類別的成員變數和方法,不能越過父類別直接呼叫父類別的父類別中的成員變數或方法。當然如果父類別的父類別中的成員變數或方法被父類別繼承,那麼是可以透過super來呼叫該成員變數和方法的,但這時實際呼叫的是父類別中的成員變數和方法。例如:


class a {
  protected int mNum = 0;
  public void setNum(int i) {
    mNum = i;
  }
}
class b extends a {
  public void setNum(int i) {
    mNum = i * i;
  }
}
class c extends b {
  public void setNum(int i) {
    super.setNum(i);    //调用的是b中的setNum()方法
    super.super.setNum(i); //错误,不支持的用法
  }
}


class a {
  protected int mNum = 0;
  public void setNum(int i) {
    mNum = i;
  }
}
class b extends a {
}
class c extends b {
  public void setNum(int i) {
    super.setNum(i);  //正确,虽然b中没有实现setNum(),但b中继承了a的setNum()函数,
              //c中调用super.setNum()调用的是b的setNum()函数,可以执行。
  }
}

以上是Java中關於super關鍵字的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn