华南俳烁实业有限公司

java

當(dāng)前位置:中華考試網(wǎng) >> java >> java基礎(chǔ) >> 文章內(nèi)容

Javasuper關(guān)鍵字詳解

來源:中華考試網(wǎng)  [2020年11月24日]  【

  由于子類不能繼承父類的構(gòu)造方法,因此,如果要調(diào)用父類的構(gòu)造方法,可以使用 super 關(guān)鍵字。super 可以用來訪問父類的構(gòu)造方法、普通方法和屬性。

  super 關(guān)鍵字的功能:

  在子類的構(gòu)造方法中顯式的調(diào)用父類構(gòu)造方法

  訪問父類的成員方法和變量。

  super調(diào)用父類構(gòu)造方法

  super 關(guān)鍵字可以在子類的構(gòu)造方法中顯式地調(diào)用父類的構(gòu)造方法,基本格式如下:

  super(parameter-list);

  其中,parameter-list 指定了父類構(gòu)造方法中的所 有參數(shù)。super( ) 必 須是在子類構(gòu)造方法的方法體的第 一行。

  例1

  聲明父類 Person 和子類 Student,在 Person 類中定義一個帶有參數(shù)的構(gòu)造方法,代碼如下:

  public class Person {

  public Person(String name) {

  }

  }

  public class Student extends Person {

  }

  會發(fā)現(xiàn) Student 類出現(xiàn)編譯錯誤,提示必 須顯式定義構(gòu)造方法,錯誤信息如下:

  Implicit super constructor Person() is undefined for default constructor. Must define an explicit constructor

  在本例中 JVM 默認(rèn)給 Student 類加了一個無參構(gòu)造方法,而在這個方法中默認(rèn)調(diào)用了 super(),但是 Person 類中并不存在該構(gòu)造方法,所以會編譯錯誤。

  如果一個類中沒有寫任何的構(gòu)造方法,JVM 會生成一個默認(rèn)的無參構(gòu)造方法。在繼承關(guān)系中,由于在子類的構(gòu)造方法中,第 一條語句默認(rèn)為調(diào)用父類的無參構(gòu)造方法(即默認(rèn)為 super(),一般這行代碼省略了)。所以當(dāng)在父類中定義了有參構(gòu)造方法,但是沒有定義無參構(gòu)造方法時,編譯器會強制要求我們定義一個相同參數(shù)類型的構(gòu)造方法。

  例2

  聲明父類 Person,類中定義兩個構(gòu)造方法。示例代碼如下:

  public class Person {

  public Person(String name, int age) {

  }

  public Person(String name, int age, String sex) {

  }

  }

  子類 Student 繼承了 Person 類,使用 super 語句來定義 Student 類的構(gòu)造方法。示例代碼如下:

  public class Student extends Person {

  public Student(String name, int age, String birth) {

  super(name, age); // 調(diào)用父類中含有2個參數(shù)的構(gòu)造方法

  }

  填寫下面表單即可預(yù)約申請免費試聽java課程!害怕學(xué)不會?助教陪讀,隨時解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國推薦就業(yè)!

預(yù)約申請免費聽java課程

  • 地區(qū):
  • 姓名:
  • 手機:

  public Student(String name, int age, String sex, String birth) {

  super(name, age, sex); // 調(diào)用父類中含有3個參數(shù)的構(gòu)造方法

  }

  }

  從上述 Student 類構(gòu)造方法代碼可以看出,super 可以用來直接調(diào)用父類中的構(gòu)造方法,使編寫代碼也更加簡潔方便。

  編譯器會自動在子類構(gòu)造方法的第 一句加上super();來調(diào)用父類的無參構(gòu)造方法,必 須寫在子類構(gòu)造方法的第 一句,也可以省略不寫。通過 super 來調(diào)用父類其它構(gòu)造方法時,只需要把相應(yīng)的參數(shù)傳過去。

  super訪問父類成員

  當(dāng)子類的成員變量或方法與父類同名時,可以使用 super 關(guān)鍵字來訪問。如果子類重寫了父類的某一個方法,即子類和父類有相同的方法定義,但是有不同的方法體,此時,我們可以通過 super 來調(diào)用父類里面的這個方法。

  使用 super 訪問父類中的成員與 this 關(guān)鍵字的使用相似,只不過它引用的是子類的父類,語法格式如下:

  super.member

  其中,member 是父類中的屬性或方法。使用 super 訪問父類的屬性和方法時不用位于第 一行。

  super調(diào)用成員屬性

  當(dāng)父類和子類具有相同的數(shù)據(jù)成員時,JVM 可能會模糊不清。我們可以使用以下代碼片段更清楚地理解它。

  class Person {

  int age = 12;

  }

  class Student extends Person {

  int age = 18;

  void display() {

  System.out.println("學(xué)生年齡:" + super.age);

  }

  }

  class Test {

  public static void main(String[] args) {

  Student stu = new Student();

  stu.display();

  }

  }

  輸出結(jié)果為:

  學(xué)生年齡:12

  在上面的例子中,父類和子類都有一個成員變量 age。我們可以使用 super 關(guān)鍵字訪問 Person 類中的 age 變量。

  super調(diào)用成員方法

  當(dāng)父類和子類都具有相同的方法名時,可以使用 super 關(guān)鍵字訪問父類的方法。具體如下代碼所示。

  class Person {

  void message() {

  System.out.println("This is person class");

  }

  }

  class Student extends Person {

  void message() {

  System.out.println("This is student class");

  }

  void display() {

  message();

  super.message();

  }

  }

  class Test {

  public static void main(String args[]) {

  Student s = new Student();

  s.display();

  }

  }

  輸出結(jié)果為:

  This is student class

  This is person class

  在上面的例子中,可以看到如果只調(diào)用方法 message( ),是當(dāng)前的類 message( ) 被調(diào)用,使用 super 關(guān)鍵字時,是父類的 message( ) 被調(diào)用。

  super和this的區(qū)別

  this 指的是當(dāng)前對象的引用,super 是當(dāng)前對象的父對象的引用。下面先簡單介紹一下 super 和 this 關(guān)鍵字的用法。

  super 關(guān)鍵字的用法:

  super.父類屬性名:調(diào)用父類中的屬性

  super.父類方法名:調(diào)用父類中的方法

  super():調(diào)用父類的無參構(gòu)造方法

  super(參數(shù)):調(diào)用父類的有參構(gòu)造方法

  如果構(gòu)造方法的第 一行代碼不是 this() 和 super(),則系統(tǒng)會默認(rèn)添加 super()。

  this 關(guān)鍵字的用法:

  this.屬性名:表示當(dāng)前對象的屬性

  this.方法名(參數(shù)):表示調(diào)用當(dāng)前對象的方法

  當(dāng)局部變量和成員變量發(fā)生沖突時,使用this.進(jìn)行區(qū)分。

  關(guān)于 Java super 和 this 關(guān)鍵字的異同,可簡單總結(jié)為以下幾條。

  子類和父類中變量或方法名稱相同時,用 super 關(guān)鍵字來訪問?梢岳斫鉃 super 是指向自己父類對象的一個指針。在子類中調(diào)用父類的構(gòu)造方法。

  this 是自身的一個對象,代表對象本身,可以理解為 this 是指向?qū)ο蟊旧淼囊粋指針。在同一個類中調(diào)用其它方法。

  this 和 super 不能同時出現(xiàn)在一個構(gòu)造方法里面,因為 this 必 然會調(diào)用其它的構(gòu)造方法,其它的構(gòu)造方法中肯定會有 super 語句的存在,所以在同一個構(gòu)造方法里面有相同的語句,就失去了語句的意義,編譯器也不會通過。

  this( ) 和 super( ) 都指的是對象,所以,均不可以在 static 環(huán)境中使用,包括 static 變量、static 方法和 static 語句塊。

  從本質(zhì)上講,this 是一個指向?qū)ο蟊旧淼闹羔? 然而 super 是一個 Java 關(guān)鍵字。

  例 3

  在 Animal 類和 Cat 類中分別定義了 public 類型的 name 屬性和 private 類型的 name 屬性,并且 Cat 類繼承 Animal 類。那么,我們可以在 Cat 類中通過 super 關(guān)鍵字來訪問父類 Animal 中的 name 屬性,通過 this 關(guān)鍵字來訪問本類中的 name 屬性,如下面的代碼:

  // 父類Animal的定義

  public class Animal {

  public String name; // 動物名字

  }

  //子類Cat的定義

  public class Cat extends Animal {

  private String name; // 名字

  public Cat(String aname, String dname) {

  super.name = aname; // 通過super關(guān)鍵字來訪問父類中的name屬性

  this.name = dname; // 通過this關(guān)鍵字來訪問本類中的name屬性

  }

  public String toString() {

  return "我是" + super.name + ",我的名字叫" + this.name;

  }

  public static void main(String[] args) {

  Animal cat = new Cat("動物", "喵星人");

  System.out.println(cat);

  }

  }

  上述代碼演示了使用 super 關(guān)鍵字訪問父類中與子類同名的成員變量 name,this 關(guān)鍵字訪問本類的 name 變量。運行程序,輸出結(jié)果如下:

  我是動物,我的名字叫喵星人

責(zé)編:fushihao

上一篇:Java封裝圖書信息類

下一篇: 沒有了

  • 會計考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學(xué)歷考試
丽水市| 项城市| 阿图什市| 宜昌市| 景谷| 深水埗区| 吕梁市| 鹤庆县| 扶风县| 峡江县| 德格县| 灵璧县| 宁阳县| 新营市| 奉贤区| 张家川| 正镶白旗| 西和县| 花莲县| 苍南县| 巴彦县| 乌兰察布市| 宝丰县| 延安市| 英吉沙县| 灵台县| 玉树县| 车致| 桂平市| 建阳市| 河曲县| 金坛市| 如皋市| 聂拉木县| 郴州市| 大荔县| 南木林县| 云南省| 井冈山市| 平江县| 永新县|