如题,看一下下面的程序,谢谢啦 package net.chapter1; 
class AA{ 
void draw(){ 
System.out.println("AA.draw()"); 

AA(){ 
System.out.println("AA() before draw()"); 
draw(); 
System.out.println("AA() after draw()"); 


public class GouZaoDraw extends AA{ 
private int i=1; GouZaoDraw(int i){ 
this.i=i; 
System.out.println("GouZaoDraw :"+this.i); 
} void draw(){ 
System.out.println("GouZaoDraw: "+i); 
} public static void main(String[] args){ 
new GouZaoDraw(5); 

} /* 
输出结果为: AA() before draw() 
GouZaoDraw: 0 
AA() after draw() 
GouZaoDraw :5 我好奇的是AA的构造函数中调用的 draw()为什么是被覆盖后的draw?按从基类到导出类的顺序,draw不是应该还没被覆盖的吗? 
哪位达人帮忙解答一下?谢谢先! 
*/有人叫我记住三句话:
1.所有的属性取决于编译时类型; 2.所有的静态方法取决于编译时类型; 3.所有的普通方法取决于运行时类型。 
虽然实用,但不理解啊
系诶下颚

解决方案 »

  1.   

    如果draw()方法调的是父类的,那就创建了一个父类对象了,可是调子类的draw()方法也是不太理解诶!
      

  2.   


    但是在第三部中的时候,调用了draw()方法,这个方法又是谁的呢?你没有说明白啊
    第三部是怎么工作的呢?在本程序中 
      

  3.   

    为什么中间输出的是GouZaoDraw: 0 ; 不是GouZaoDraw: 1  ??
      

  4.   

    你可以把这段程序调试一下,
    首先要找到GouZaoDraw的构造方法,但不执行,
    再去到AA(),输出AA() before draw()
    再调用GouZaoDraw中的draw(),此时的i还未被初始化所以输出GouZaoDraw:0
    再输出AA() after draw()
    然后回到了GouZaoDraw类中,初始化i的值,进到GouZaoDraw()构造方法中,有参数5把1覆盖,输出GouZaoDraw:5 
    但是为什么会调用到GouZaoDraw中的draw()还是不知道为什么诶!
      

  5.   

    在编译时就已经覆盖了父类的draw(),所以只能调用子类的draw()
      

  6.   

    是这样执行的,
    但是为什么会调用到GouZaoDraw中的draw()还是不知道为什么诶!//重载