日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1.4 super关键字详解

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.4 super关键字详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于子類不能繼承父類的構造方法,因此,如果要調用父類的構造方法,可以使用 super 關鍵字。super 可以用來訪問父類的構造方法、普通方法和屬性。

super 關鍵字的功能:

  • 在子類的構造方法中顯式的調用父類構造方法
  • 訪問父類的成員方法和變量。

super 關鍵字的用法:

  • super.父類屬性名:調用父類中的屬性
  • super.父類方法名:調用父類中的方法
  • super():調用父類的無參構造方法
  • super(參數):調用父類的有參構造方法

super調用父類構造方法

super 關鍵字可以在子類的構造方法中顯式地調用父類的構造方法,基本格式如下:

super(parameter-list);

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

例1
聲明父類 Person 和子類 Student,在 Person 類中定義一個帶有參數的構造方法,代碼如下:

public class Person {public Person(String name) {} } public class Student extends Person { }

會發現 Student 類出現編譯錯誤,提示必須顯式定義構造方法,錯誤信息如下:

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

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

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

例2
聲明父類 Person,類中定義兩個構造方法。示例代碼如下:

public class Person {public Person(String name, int age) {}public Person(String name, int age, String sex) {} } 子類 Student 繼承了 Person 類,使用 super 語句來定義 Student 類的構造方法。示例代碼如下: public class Student extends Person {public Student(String name, int age, String birth) {super(name, age); // 調用父類中含有2個參數的構造方法}public Student(String name, int age, String sex, String birth) {super(name, age, sex); // 調用父類中含有3個參數的構造方法} }

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

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

super訪問父類成員

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

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

super.member

其中,member 是父類中的屬性或方法。使用 super 訪問父類的屬性和方法時不用位于第一行。
super調用成員屬性
當父類和子類具有相同的數據成員時,JVM 可能會模糊不清。我們可以使用以下代碼片段更清楚地理解它。

class Person {int age = 12; } class Student extends Person {int age = 18;void display() {System.out.println("學生年齡:" + super.age);} } class Test {public static void main(String[] args) {Student stu = new Student();stu.display();} }

輸出結果為:

學生年齡:12

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

super調用成員方法
當父類和子類都具有相同的方法名時,可以使用 super 關鍵字訪問父類的方法。具體如下代碼所示。

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();} }

輸出結果為:

This is student class This is person class

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

super和this的區別

this 指的是當前對象的引用,super 是當前對象的父對象的引用。下面先簡單介紹一下 super 和 this 關鍵字的用法。

super 關鍵字的用法:

  • super.父類屬性名:調用父類中的屬性
  • super.父類方法名:調用父類中的方法
  • super():調用父類的無參構造方法
  • super(參數):調用父類的有參構造方法

如果構造方法的第一行代碼不是 this() 和 super(),則系統會默認添加 super()。

this 關鍵字的用法:

  • this.屬性名:表示當前對象的屬性
  • this.方法名(參數):表示調用當前對象的方法

當局部變量和成員變量發生沖突時,使用this.進行區分。

關于 Java super 和 this 關鍵字的異同,可簡單總結為以下幾條。

  • 子類和父類中變量或方法名稱相同時,用 super 關鍵字來訪問。可以理解為 super
    是指向自己父類對象的一個指針。在子類中調用父類的構造方法。
  • this 是自身的一個對象,代表對象本身,可以理解為 this 是指向對象本身的一個指針。在同一個類中調用其它方法。
  • this 和 super 不能同時出現在一個構造方法里面,因為 this 必然會調用其它的構造方法,其它的構造方法中肯定會有 super
    語句的存在,所以在同一個構造方法里面有相同的語句,就失去了語句的意義,編譯器也不會通過。
  • this( ) 和 super( ) 都指的是對象,所以,均不可以在 static 環境中使用,包括 static 變量、static
    方法和 static 語句塊。
  • 從本質上講,this 是一個指向對象本身的指針, 然而 super 是一個 Java 關鍵字。
  • 例 3
    在 Animal 類和 Cat 類中分別定義了 public 類型的 name 屬性和 private 類型的 name 屬性,并且 Cat 類繼承 Animal 類。那么,我們可以在 Cat 類中通過 super 關鍵字來訪問父類 Animal 中的 name 屬性,通過 this 關鍵字來訪問本類中的 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關鍵字來訪問父類中的name屬性this.name = dname; // 通過this關鍵字來訪問本類中的name屬性}public String toString() {return "我是" + super.name + ",我的名字叫" + this.name;}public static void main(String[] args) {Animal cat = new Cat("動物", "喵星人");System.out.println(cat);} }

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

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

    總結

    以上是生活随笔為你收集整理的1.4 super关键字详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。