构造器在多态中的调用顺序
package com.zx.test08;class Meal {//餐Meal() {System.out.println("Meal无参构造器");}class Bread {//面包Bread() {System.out.println("Bread无惨构造器");}}}class Cheese{//奶酪Cheese(){System.out.println("Cheese无惨构造器");}}class Lettuce {//莴苣Lettuce() { System.out.println("lettuce无参构造器"); }}class Lunch extends Meal{ Lunch(){ System.out.println("Lunch无参构造器"); } }class ProtableLunch extends Lunch {ProtableLunch(){System.out.println("ProtableLunch无参构造器");}}public class Sandwich extends ProtableLunch{private Bread b=new Bread();private Cheese c=new Cheese();private Lettuce l=new Lettuce();Sandwich(){System.out.println("Sandwich无参构造器");}public static void main(String[] args) {new Sandwich();}}//Output:Meal无参构造器Lunch无参构造器ProtableLunch无参构造器Bread无惨构造器Cheese无惨构造器lettuce无参构造器Sandwich无参构造器
总结:
调用基类构造器,不断的递归直到最底层的导出类 <br />
构造器内部的多态方法和行为
如果要在基类的构造器中调用多态方法的话,那么该方法会被导类中的方法所覆盖。所以说在构造器中能被安全调用的方法是基类中被fianl修饰的(也适用于private)
class Glyoh {void draw() {System.out.println("Glyoh.draw()");}Glyoh() {System.out.println("draw调用前");draw();System.out.println("draw调用后");}}class RoundGlyph extends Glyoh {private int radius =1;RoundGlyph(int r){radius=r;System.out.println("RoundGlyph的无惨构造方法"+radius);}@Overridevoid draw() {System.out.println("RoumdGlyph.draw"+" ”+radius);}}public class PolyContstructors {public static void main(String[] args) {new RoundGlyph(5);}}/** 先执行基类的构造器,同时基类构造其中的方法将被导出类的方法所覆盖。此时导出类中的变量还未被初始化(基类构造器执行后才会初始化)然后是导出类中的构造器。* */Output:draw调用前RoumdGlyph.draw 0draw调用后RoundGlyph的无惨构造方法5
初始化.顺序总结
1.在其他任何事物发生之前,将会给对象分配二进制初始化为0的空间
2.如果有静态域、静态代码块,按照声明顺序执行初始化
3.如果有普通域、普通代码块,按照声明顺序执行初始化
4.最后执行构造器中的代码,按声明顺序【构造器是确保初始化的最后屏障】
