super关键字
一、super:类似于this(此对象的…),super可以理解为父类的…
二、super可以用来调用属性、方法、构造器
三、super的使用
1.可以在子类的方法或构造器中,通过“super.属性”或“super.方法”的方式显式的调用父类中声明的属性或方法。但是通常情况下省略“super.”
2.特殊情况,当子类和父类定义同名的属性时,要想在子类调用父类中声明的属性,则必须显式的使用“super.属性”的方式,表明调用的是父类中的属性。
如
class Person{int id;}
class Student extends Person{int id;}
则直接在子类的方法或构造器中写id代表的是子类的id;this.id也代表子类的id;super.id代表是父类的id
3.当子类重写父类中的方法后,想在子类的方法中调用父类中被重写的方法时,则必须显式的使用“super.属性”的方式,表明调用的是父类中被重写的方法。
总结:在子类中想调子类的结构,啥都不加或加“this.”;想调父类的结构,加“super.”
四、super调用构造器
1.可以在子类的构造器中显式的使用“super(形参列表)”的方式,调用父类中指定的构造器
如
public class Person {
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Student extends Person{
Student(String name, int age, String major){
super(name, age);//调用父类构造器
this.major = major;
}
}
2.“super(形参列表)”需声明在子类构造器的首行。所以在构造器中只能在“this(形参列表)”和“super(形参列表)”二选一,不能同时出现
3.在构造器首行没有显式的声明“this(形参列表)”和“super(形参列表)”,则默认调用的是父类中空参的构造器:super()
如
public class Student extends Person{
Student(String major){
this.major = major;//没有“this(形参列表)”和“super(形参列表)”,则默认在这个构造器中有一个super();
}
}
所以父类中一定要有空参构造器,否则创建子类的时候构造器会出错(出错提示:Implicit super constructor Person() is undefined. ),因为要调用spuer();
4.在类的多个构造器中,至少有一个类的构造器中使用了"super(形参列表)“。