日期:2014-05-20  浏览次数:21130 次

继承相关
class Base {  
public void draw() 
{   
System.out.println("base.draw");  
}  

Base()   
{  
draw();
System.out.println("base end");   
}    
}         

public class Test extends Base 
{   
Test() 
{   
draw();
System.out.println("test end"); 
}    
      
public void draw() 
{   
System.out.println("test.draw " );  
}

public static void main(String[] args) 
{       
Test t1 = new Test();    
}            
}
=======执行结果==============================
F:\java\javaproj>java Test
test.draw
base end
test.draw
test end
=============================================
为什么父类构造函数中的draw()方法,调用了子类的draw()方法?
------解决方案--------------------
虚拟机在执行构造方法之前把子类的draw方法覆盖了父类的,如有需要就得特别指出
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

虚拟机在执行构造方法之前把子类的draw方法覆盖了父类的,如有需要就得特别指出


那只要是父类被覆盖的方法,如果在父类的构造函数中,被调用执行时,都是调用了子类的函数??
就这点想不明白。

谢谢你的答复!


还有就是,在父类的构造函数里,即使使用this.draw();仍然会调用子类覆盖的那个方法,麻烦帮忙解释下,谢谢了!!

怎么说,引用编程思想一句话:如果要调用构造器内部的一个动态绑定方法(多态原理),就要用到那个方法的被覆盖后的定义,然而,这个调用的效果可能相当难以预料,……
总结起来就是他想怎么干是虚拟机的事,你在这虚拟机实现的在另外一个可能实现不一样,你只要做构造器该做的事,别做多余的动作。具体可参考编程思想多态一节