super关键字
使用super可以调用父类的成分:父类的成员变量、父类的方法、父类的构造方法。
注意:使用super关键字和this关键字,均不能用在静态方法中,只能用在普通方法(实例方法)中。
7.1访问属性:
父类
public class FatherClass{
public int age=18;
}
子类
public class ChildClass extends FatherClass{
public int age = 10;
public void test1(){
System.out.println(this.age);//这里将输出 10
}
public void test2(){
System.out.println(super.age);//这里将输出 18
}
public void test3(){
System.out.println(age);//这里将输出 10;默认情况,如果父类存在age属性,子类也存在age属性,直接访问age将是以 this.age 形势访问。但如果本类不存在age属性,则将以 super.age 的形势访问。
}
}
7.2 访问方法:
父类
public class FatherClass{
public void show(){
System.out.println("Father类方法");
}
}
子类
public class ChildClass extends FatherClass{
public void show(){
System.out.println("Child类方法");
}
public void test1(){
this.show();//这里将输出:Child类方法
}
public void test2(){
super.show();//这里将输出:Father类方法
}
public void test3(){
show();//这里将输出:Child类方法;
//默认情况,如果父类存在show()方法,子类也存在show()方法,直接访问show()方法将是以 this.show() 形势访问。但如果本类不存在show()方法,则将以 super.show() 的形势访问。
}
}
7.3 this和super的区别
7.4 继承中的构造方法
由于子类和父类的类名(包括包名)肯定不同,而构造方法的名字必须和类名一致,所以构造方法不能继承。
创建子类对象时,子类会继承父类的一些元素,所以子类会先访问父类的构造方法。
7.4.1 调用父类的构造方法
子类实例化时,必须首先调用父类的构造方法,然后才是子类的构造方法。默认情况调用的为父类的无参构造方法。
public class FatherClass {
int age;
public FatherClass() {
super();
}
public FatherClass(int age) {
this.age = age;
}
}
调用父类的构造方法:
public class ChildClass extends FatherClass {
public ChildClass() {
super();//默认调用无参构造方法
}
public ChildClass(int age) {
super(age);//指定调用父类的具体构造方法
}
}
注意:
有时,需要在子类的构造方法中来调用父类的某个特定的构造方法。语法:super(实参,实参,实参……)
super()调用父类构造方法时,必须是子类该构造方法的第一行代码。
实参可以为空,当实参为空时表示调用的是父类的无参构造方法,此时与省略super()效果相同.
7.4.2 继承关系的初始化顺序是怎样的?
(笔记:但调用是先调用的子类构造器)