在Java中,super
關鍵字用于引用父類的成員(屬性、方法或構造器)。它在繼承關系中非常重要,主要用于以下幾種場景:
1. 調用父類的構造器
- 在子類的構造器中,可以使用
super
關鍵字調用父類的構造器。 super()
必須放在子類構造器的第一行。- 如果子類構造器中沒有顯式調用
super()
,編譯器會自動插入對父類無參構造器的調用。
示例:
class Animal {private String name;// 父類構造器public Animal(String name) {this.name = name;System.out.println("Animal constructor: " + name);}
}class Dog extends Animal {private String breed;// 子類構造器public Dog(String name, String breed) {super(name); // 調用父類構造器this.breed = breed;System.out.println("Dog constructor: " + breed);}
}public class Main {public static void main(String[] args) {Dog myDog = new Dog("Buddy", "Golden Retriever");}
}
輸出:
Animal constructor: Buddy
Dog constructor: Golden Retriever
2. 訪問父類的成員變量
- 如果子類和父類有同名的成員變量,可以使用
super
關鍵字訪問父類的成員變量。
示例:
class Animal {protected String name = "Animal";
}class Dog extends Animal {private String name = "Dog";public void printNames() {System.out.println("Subclass name: " + name); // 訪問子類的nameSystem.out.println("Superclass name: " + super.name); // 訪問父類的name}
}public class Main {public static void main(String[] args) {Dog myDog = new Dog();myDog.printNames();}
}
輸出:
Subclass name: Dog
Superclass name: Animal
3. 調用父類的方法
- 如果子類重寫了父類的方法,可以使用
super
關鍵字調用父類的原始方法。
示例:
class Animal {public void makeSound() {System.out.println("Animal is making a sound.");}
}class Dog extends Animal {@Overridepublic void makeSound() {super.makeSound(); // 調用父類的方法System.out.println("Dog is barking: Woof! Woof!");}
}public class Main {public static void main(String[] args) {Dog myDog = new Dog();myDog.makeSound();}
}
輸出:
Animal is making a sound.
Dog is barking: Woof! Woof!
4. super
與this
的區別
特性 | super | this |
---|---|---|
作用 | 引用父類的成員(屬性、方法、構造器) | 引用當前對象的成員(屬性、方法、構造器) |
調用構造器 | 用于調用父類的構造器(super() ) | 用于調用當前類的其他構造器(this() ) |
訪問成員變量 | 訪問父類的成員變量 | 訪問當前類的成員變量 |
訪問方法 | 調用父類的方法(即使子類重寫了該方法) | 調用當前類的方法 |
位置限制 | 必須放在子類構造器的第一行 | 必須放在構造器的第一行 |
5. 注意事項
-
super
必須在第一行:- 在構造器中,
super()
或this()
必須作為第一條語句,不能同時出現。 - 如果子類構造器中沒有顯式調用
super()
,編譯器會自動插入對父類無參構造器的調用。
- 在構造器中,
-
父類必須有無參構造器:
- 如果父類沒有無參構造器,子類必須顯式調用父類的有參構造器,否則會編譯錯誤。
-
super
不能用于靜態上下文:super
關鍵字不能用于靜態方法或靜態代碼塊中,因為靜態成員屬于類,而不是對象。
6. 總結
super
關鍵字用于在子類中訪問父類的成員(屬性、方法或構造器)。- 它在繼承關系中非常重要,尤其是在方法重寫和構造器調用時。
- 合理使用
super
可以確保子類正確繼承和擴展父類的功能。