public class Child extends Father{
public String name="Child";
public String age="18";
@Override
void sayAge() {
System.out.println("Child say age:\t"+this.age);
}
Child(){
sayName();
sayAge();
super.sayAge();
}
public static void main(String[] args) {
new Child();
}
}
class Father {
private String name="Father";
public String age="40";
Father() {
sayName();
sayAge();
}
void sayName(){
System.out.println("Father say name:\t"+name);
}
void sayAge(){
System.out.println("Father say age:\t"+this.age);
}
}
简述一下代码大概写了什么:
首先有一个父类Father,它有两个变量name私有age公共,然后他有两个方法分别是对这两个变量进行输出,需要注意的是它的构造方法就是调用这两个方法。>>>再然后是有一个继承Father类的子类Child,它具有一个与父类同名的变量name, 然后在类中对父类的sayAge()方法进行重写,然后它的构造方法也是像父类一样,调用两个方法。
答案:
Father say name: Father
Child say age: null
Father say name: Father
Child say age: 18
Father say age: 40
分析执行流程: new Child() -->调用Child构造方法,然后发现Child具有父类,需要先去父类继承既有的变量和方法,会走到父类的构造方法,父类的Father.name和Father.age被赋值,然后走父类构造方法,走sayName方法就走父类自己的Father say name :Father,但是当走sayAge方法时因为当前执行的主体是子类就会调用子类重写过的sayAge方法,但是子类的sayAge是拿不到位于父类堆中的age变量的,因此输出会变成Child say age:null,走完父类的构造方法就开始回到子类中的构造方法,当然也是先赋值,然后走构造器,走到没有被重写的方法就会回到父类调用父类的方法,变量也是Father.xxx。最后形成的情况就是,父类走子类类的方法拿不到子类的变量,子类走父类的方法可以拿到父类的变量(即使本类中已经对父类中变量做覆盖)