构造器在多态中的调用顺序
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);
}
@Override
void draw() {
System.out.println("RoumdGlyph.draw"+" ”+radius);
}
}
public class PolyContstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
/*
* 先执行基类的构造器,同时基类构造其中的方法将被导出类的方法所覆盖。
此时导出类中的变量还未被初始化(基类构造器执行后才会初始化)
然后是导出类中的构造器。
* */
Output:
draw调用前
RoumdGlyph.draw 0
draw调用后
RoundGlyph的无惨构造方法5
初始化.顺序总结
1.在其他任何事物发生之前,将会给对象分配二进制初始化为0的空间
2.如果有静态域、静态代码块,按照声明顺序执行初始化
3.如果有普通域、普通代码块,按照声明顺序执行初始化
4.最后执行构造器中的代码,按声明顺序【构造器是确保初始化的最后屏障】