1 多态代码运行
public class FFF{
public static void main(String[] args) {
Parent c = new son();
}
}
class son extends Parent {
public int a = 2;
public static int b = 2;
public son() {
super();
System.out.println("子类构造完成");
}
public void test() {
System.out.println("子类test方法");
System.out.println("a = " + a + " b = " + b);
}
}
class Parent {
public int a = 1;
public static int b = 1;
public Parent() {
test();
System.out.println("父类构造完成");
}
public void test() {
System.out.println("父类test方法");
System.out.println("a = " + a + " b = " + b);
}
}
运行结果:
子类test方法
a = 0 b = 2
父类构造完成
子类构造完成
2 分析
代码运行顺序为:
1.调用子类的构造器;
2.super() 调用父类空参构造器;
3.父类空参构造器 调用test()
方法,实际上调用的是子类的test()
,故会打印出 “子类test方法”;
4.执行完子类的test()方法,回到父类构造器,打印"父类构造完成";
5.执行子类构造器的打印方法,打印““子类构造完成””;
但是子类test方法在执行 System.out.println("a = " + a + " b = " + b);
时打印出 “a = 0 b = 2”;可以发现a变量此时为默认数值,这是为什么?
1.首先要清楚子类test方法调用的是子类中的成员变量a与静态变量b
2.其次要清楚继承类对象的初始化顺序:
- 1)父类中的静态变量 、父类中的静态代码块(按照相对顺序执行)
- 2)子类静态变量、子类静态代码块(按照相对顺序执行)
- 3)父类成员变量
- 4)父类代码块
- 5)父类构造器
- 6)子类成员变量
- 7)子类代码块
- 8)子类构造器
故可以知道在调用父类构造器后即为执行到第7步,而此时去调用子类的test方法,此时对于子类中已经执行第3步,即已经对静态变量b完成赋值,但是还未执行到第8步,即对成员变量a赋值,故子类test方法在打印a、b的数值时,a为0,b为2