先说Zi z = new Zi():静态代码块随类加载而加载,肯定会先执行所有的,无论建多少个对象都只执行一次,而构造代码块会随对象的建立而先执行。 当建立子类的对象后,先打印aa、11,然后去子类中调用这个对象的相同参数的构造函数,而每个构造函数里的第一行如果没定义super()都会有一个隐式的super(),这时它会先去调用父类中的相同参数的构造函数,同时建立父类构造函数的对象,然后执行父类中的构造代码块,打印bb,然后执行此父类构造函数,打印cc,执行完父类再回来执行自己,先打印构造代码块22,然后打印33。
所以打印:aa,11,bb,cc,22,33.
再说Fu f = new Zi():这个是子类当做父类建立对象,在这个程序中跟Zi z = new Zi()执行结果一样。
不同是:如果调用到子类中特有的函数(即父类中没有的函数,而子类中有)这时就需要强转:Zi z =(Zi)f,才能调用到子类;
子类当父类建立对象,即使子类类中有相同的函数都只会调用到子类中对象的构造函数。
注:构造代码块是建立几个对象就会执行几次,而静态代码块无论建立多少个对象都只会执行一次。 |