关于一个多态案例的理解

 

package polymorphic;

 class Glyph {
   void draw(){System.out.println("Glyph.draw()");}

	public Glyph() {
		System.out.println("Glyph() before draw()");
	    draw();
		System.out.println("Glyph() after draw()");
	}
   
}
class RoundGlyph extends Glyph {
	String ff="i lovw";
    void draw(){System.out.println("RoundGlyph.draw()"+radius);
    System.out.println("ff"+ff);
    }
    private int radius=1;
	public RoundGlyph(int r) {
		radius=r;
		System.out.println("RoundGlyph.RoundGlyph,raius="+radius);
	}
}
public class PolyConstructor {
	  public static void main(String[] args) {
		new RoundGlyph(5);
	}
	}
/*output:
Glyph() before draw()
RoundGlyph.draw()0
Glyph() after draw()
RoundGlyph.RoundGlyph,raius=5
*/

 
//这个例子告诉我们初始化一个对象的步骤应该是这样的:
//1在调用父类构造器之前 对象的存储空间初始化为二进制的0
//2然后会调用基类的构造器,发现draw()方法被覆盖后,由于后期绑定的缘故,会调用子类对象本身draw()方法.
//此时方法中的radius变量还未进行初始化 所以显示为0
//3然后才会按照声明的顺序 初始化操作的成员
//4调用导出类的构造器主体

//所以我认为多态你需要注意的两个概念  第一个就是 动态绑定
//就是运行时根据对象的类型进行动态绑定 这是动态绑定的定义
//第二个需要注意的地方 就是这个构造器中有多态对象存在的案例
//所有子类对象还未进行初始化 但是 虚拟机会将对象的所有东西至少初始化为0
//为了避免这种情况发生 你可有在基类使用final或者private 避免多态出现

 

 

你可能感兴趣的:(多态)