Java中的super是一个关键字,用于访问父类的方法、属性和构造函数
用法:
1、调用父类的构造函数
在子类的构造函数中使用super()来调用父类的构造函数,以确保父类的初始化工作得以完成。示例代码:
public class Animal {
public Animal() {
System.out.println("Animal is created");
}
}
public class Dog extends Animal {
public Dog() {
super(); // 调用父类构造函数
System.out.println("Dog is created");
}
}
2、调用父类的方法或属性
使用super关键字来访问父类中的方法或属性,即使在子类中重写了这些方法或属性。示例代码:
public class Animal {
public void makeSound() {
System.out.println("Animal is making sound");
}
}
public class Dog extends Animal {
public void makeSound() {
super.makeSound(); // 调用父类方法
System.out.println("Dog is barking");
}
}
3、在子类中间接调用父类的构造函数
子类的构造函数中可以通过调用其他的构造函数来间接调用父类的构造函数,使用super()或this()来实现。示例代码:
public class Animal {
private String name;
private int age;
public Animal() {
this("unknown",0); // 调用有参构造函数
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Dog extends Animal {
private String breed;
public Dog() {
this("unknown",0, "unknown"); // 调用有参构造函数
}
public Dog(String name, int age, String breed) {
super(name, age); // 调用父类构造函数
this.breed = breed;
}
}
注意点:
1、super必须是子类中的第一条语句,用于调用父类构造函数或调用父类方法,否则会报错;
2、调用父类构造函数时,只能使用super()或者super(参数列表),不能使用this();
3、父类的构造函数不会被继承,子类必须显式地调用父类的构造函数;
子类可以继承父类中的静态方法和属性,但不能使用super调用。
常见面试问题:
1、什么情况下需要使用super关键字?
2、super和this有什么区别?
3、子类的构造函数中调用父类的构造函数时,为什么必须是第一条语句?
4、父类中的静态方法和属性可以被子类继承吗?能否使用super调用?
5、子类中重写了父类的方法,如何在子类中调用父类的方法?