关于构造器调用顺序

来源:互联网 发布:ni数据采集卡如何使用 编辑:程序博客网 时间:2024/06/06 03:26

http://zhidao.baidu.com/link?url=yaeRyr0If99iZIq7vSKwYJLqEbXQaekYzMSytH39CY8k6B0KNNbpUwwLrydPptG6PnrjYMcgtrijMuds0eviXq

如题,看一下下面的程序,谢谢啦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: 0AA() after draw()GouZaoDraw  :5我好奇的是AA的构造函数中调用的 draw()为什么是被覆盖后的draw?按从基类到导出类的顺序,draw不是应该还没被覆盖的吗?哪位达人帮忙解答一下?谢谢先!*/ 
1.所有的属性取决于编译时类型; 2.所有的静态方法取决于编译时类型; 3.所有的普通方法取决于运行时类型。 解释:你的draw方法没用用static修饰,属于普通方法,那么就取决于运行时类型。而你main函数中运行时的类型为GouZaoDraw,所以AA的构造函数中调用的draw()就是被覆盖后GouZaoDraw中的draw()。  
new 一个对象的 执行过程是 1.父类的静态成员变量初始化(按变量声明顺序) 2.父类的静态代码块执行(按代码块声明顺序) 3.子类的静态成员变量初始化(按变量声明顺序) 4.子类的静态代码块执行(按代码块声明顺序) 5.父类的实例变量初始化(按变量声明顺序) 6.父类的构造器 7.子类的实例变量初始化(按变量声明顺序) 8.子类的构造器

原创粉丝点击