如题,看一下下面的程序,谢谢啦 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.所有的普通方法取决于运行时类型。
虽然实用,但不理解啊
系诶下颚
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.所有的普通方法取决于运行时类型。
虽然实用,但不理解啊
系诶下颚
但是在第三部中的时候,调用了draw()方法,这个方法又是谁的呢?你没有说明白啊
第三部是怎么工作的呢?在本程序中
首先要找到GouZaoDraw的构造方法,但不执行,
再去到AA(),输出AA() before draw()
再调用GouZaoDraw中的draw(),此时的i还未被初始化所以输出GouZaoDraw:0
再输出AA() after draw()
然后回到了GouZaoDraw类中,初始化i的值,进到GouZaoDraw()构造方法中,有参数5把1覆盖,输出GouZaoDraw:5
但是为什么会调用到GouZaoDraw中的draw()还是不知道为什么诶!
但是为什么会调用到GouZaoDraw中的draw()还是不知道为什么诶!//重载