Java——super
在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); // 访问子类的name
System.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 {
@Override
public 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
可以确保子类正确继承和扩展父类的功能。