super关键字
super关键字代表的是当前对象中的父类特征
super与this一样,不能在静态上下文中使用
this可以单独输出,super无法单独输出,因为你无法确定你的父类是谁。
当父类和子类中定义了相同的属性或方法时,如果需要在子类中访问父类的属性或方法时,super不能省略
访问父类属性
当子类和父类有 同名变量 时,可以使用 super 访问父类变量。
java
class Person {
String name = "父类Person";
}
class Student extends Person {
String name = "子类Student";
void printName() {
System.out.println(name); // 子类变量
System.out.println(super.name); // 父类变量
}
}
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.printName();
}
}java
子类Student
父类Person调用父类方法
如果子类 重写了父类方法,但是只是在父类原有的方法上添加扩展,我们可以使用super调用父类中重写的方法
java
class Person {
void eat() {
System.out.println("人吃饭");
}
}
class Student extends Person {
void eat() {
super.eat()
System.out.println("学生吃完饭将餐盘放到回收处");
}
}在IDEA中,我们重写父类xxx方法时,它默认会生成:super.xxx()。确保我们就算什么也没写,程序也能正常运行
java
class Student extends Person {
@Override
void eat() {
super.eat()
}
}调用父类构造函数
子类构造方法中可以使用 super() 调用父类构造方法。
java
class Person {
Person() {
System.out.println("Person构造方法");
}
}
class Student extends Person {
Student() {
super(); // 调用父类构造方法
System.out.println("Student构造方法");
}
}
public class Test {
public static void main(String[] args) {
new Student();
}
}java
Person构造方法
Student构造方法super()必须写在构造方法第一行如果不写,Java 默认会自动调用
super()传入指定形参列,我们调用指定的父类构造方法
子类为什么要默认调用父类的构造函数?
父类的成员必须先初始化,子类对象才能完整创建。创建子类对象时,必须先把父类那一部分对象构造出来。因为 子类对象本质上包含一部分父类对象。
java
class Person {
String name
Person() {
System.out.println("Person构造");
}
}
class Student extends Person {
String name
int age
Student(name,age) {
this.name=name;
this.age=age;
System.out.println("Student构造");
}
}
public class Test {
public static void main(String[] args) {
new Student('zs');
}
}Person构造
Student构造super.name=null
this.name=zs
age调用父类的构造函数是为了给继承过来的父类型特性初始化
