JAVA问题,关于构造器调用顺序的,谢谢

来源:百度知道 编辑:UC知道 时间:2024/07/07 09:52:46
如题,看一下下面的程序,谢谢啦

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.所有的普通方法取决于运行时类型。

解释:你的draw方法没用用static修饰,属于普通方法,那么就取决于运行时类型。而你main函数中运行时的类型为GouZaoDraw,所以AA的构造函数中调用的draw()就是被覆盖后GouZaoDraw中的draw()。

我说的已经够明白的了,若还不理解的话,百度Hi我!

new 一个对象的 执行过程是
1.父类的静态成员变量初始化(按变量声明顺序)
2.父类的静态代码块执行(按代码块声明顺序)
3.子类的静态成员变量初始化(按变量声明顺序)
4.子类的静态代码块执行(按代码块声明顺序)
5.父类的实例变量初始化(按变量声明顺序)
6.父类的构造器
7.子类的实例变量初始化(按变量声明顺序)
8.子类的构造器

构造方法的调用确实是从基类到导出类的 而普通方法的调用却是直接调用子类覆盖的方法的 这是所谓的多态 记住就好

看看,这个有关父子类生成的顺序!

http://hi.baidu.com/xc_jetguo/blog/item/a99080f8b394c45e242df203.html