你仔细看你的代码,可以看到A继承与B,也就是说构造A之前会构造B。
毕老师讲过,其实在A的构造函数A()中,第一行有一个super();语句,只是我们看不见,在实例化对象的时候有一个初始化顺序,最先是初始化静态成员,然后构造父类,父类构造完成才初始化非静态的成员。
于是,在这里,在初始化int i=5之前就先执行了super()构造父类,从而调用了父类B的构造函数B(),在B()中会调用m()方法,由于父类的m方法被子类重写,于是,调用了子类的m方法,从而开始打印i,这时i还没有初始化为5,只是默认的0,所以打印了0,但是,j是一个静态变量,静态成员变量是在类初始化时就初始化的,所以,j先与对象存在,于是j打印出了5,随后,继续执行两句打印语句,在父类初始化完成后,i也进行了初始化为5的操作,于是后面的语句就成了5和4.
总之初始化的顺序就是,首先初始化你要创建的类的静态成员,然后初始化该类的父类对象,随后初始化非静态成员,然后执行该类的构造函数的其他语句。 |