耿世玉 发表于 2012-4-10 17:09
额。。。你说的我也晕了。。。
其实从一开始你就没错,老毕的视频里没讲过子类继承父类的初始化过程。当时只在静态的时候讲过初始化,而且都没讲方法区的内容,所以我一直按那个思维思考。
另外还有一点的就是过分在意子类构造函数的第一行是父类构造函数,就认为父类构造函数执行完就去执行子类构造函数了,而子类显示初始化优先于子类构造函数,所以就产生了“先有鸡还是先有蛋”的崩溃思想。
你列出的顺序很清楚:父类初始化完,再去初始化子类的非静态代码,包括非静态成员变量,非静态方法,构造代码块,和构造函数等。
父类的构造函数执行时,子类还没显示初始化了,当然结果是null。 为什么调用父类的构造方法,而父类的构造方法又去调用成员方法,为什么却用的是子类的方法?
这个问题光记结果可能更疑问,我觉得应该这样理解,你new的是子类的对象,我们知道每一个非静态方法中都有一个隐式的引用this,当你调用一个非静态方法时,这个this就指向了调用它的对象。当super方法调用print方法时,其实是指向的子类对象,而这个方法又被子类覆盖过,所以用的就是子类方法。
其实,你的那个步骤还不是非常详细,具体到网上搜吧, 从类加载进来直到一个对象new出来的整个过程。
|
|