Java 基礎(super關鍵字)
super關鍵字
-
super 理解為: 父類的
-
super 可以用來呼叫:屬性,方法,構造器
-
super 的使用
3.1 我們可以在子類的方法或構造器中。通過使用 "super.屬性" 或 "super.方法" 的方式,顯式的呼叫父類中宣告的屬性或方法。但是,通常情況下,我們習慣省略 "super."
3.2 特殊情況: 當子類和父類中定義了同名的屬性時,我們要想在子類中呼叫父類中宣告的屬性,則必須顯式的使用 "super.屬性" 的方式,表明呼叫的是父類中宣告的屬性。
3.3 特殊情況:當子類重寫了父類中的方法以後,我們想在子類的方法中呼叫父類中被重寫的方法時,則必須顯式的使用 "super.方法" 的方式,表明呼叫的是父類中被重寫的方法。 -
super呼叫構造器
4.1 我們可以在子類的構造器中顯式的使用 "super(形參列表)" 的方式,呼叫父類中宣告的指定的構造器
4.2 "super(形參列表)" 的使用,必須宣告在子類構造器的首行!
4.3 我們在類的構造器中,針對於 "this(形參列表)" 或 "super(形參列表)" 只能二選一,不能同時出現
4.4 在構造器的首行,沒有顯示的宣告 "this(形參列表)" 或 "super(形參列表)",則預設呼叫的是父類中空參的構造器,super()
4.5 在類的多個構造器中,至少有一個類的構造器中使用了 "super(形參列表)",呼叫父類中的構造器
子類物件例項化的全過程
-
從結果上來看: (繼承性)
子類繼承父類以後,就獲取了父類中宣告的屬性或方法
建立子類的物件,在堆空間中,就會載入所有父類中宣告的屬性 -
從過程上來看:
當我們通過子類的構造器建立子類物件時,我們一定會直接或間接的呼叫其父類的構造器,進而呼叫父類的父類的構造器.直到呼叫了 java.lang.Object 類中空參的構造器為止。正因為載入過所有的父類的結構,所以才可以看到記憶體中有父類中的結構,子類物件才可以考慮進行呼叫。
明確:雖然建立子類物件時,呼叫了父類的構造器,但是自始至終就建立過一個物件,即為 new 的子類物件。
Person.java
package com.klvchen.java3;public class Person { String name; int age; int id = 1001; //身份證 public Person() { System.out.println("我無處不在!"); } public Person(String name) { this.name = name; } public Person(String name, int age) { this.name = name; this.age = age; } public void eat() { System.out.println("人,吃飯"); } public void walk() { System.out.println("人,走路"); } }
Student.java
package com.klvchen.java3; public class Student extends Person { String major; int id = 1002; //學號 public Student() { } public Student(String major) { this.major = major; } public Student(String name, int age, String major) { super(name, age); this.major = major; } @Override public void eat() { System.out.println("學生,多吃有營養的食物"); } public void study() { System.out.println("學生, 學習知識"); eat(); super.eat(); this.walk(); } public void show() { System.out.println("name = " + name + ", age = " + age); System.out.println("id = " + id); System.out.println("id = " + super.id); } }
SuperTest.java
package com.klvchen.java3; public class SuperTest { public static void main(String[] args) { Student s = new Student(); s.show(); System.out.println(); s.study(); Student s1 = new Student("Tom", 21, "IT"); s1.show(); System.out.println("***********************************"); Student s2 = new Student(); } }