您的位置:首页 > 其它

菜鸟柳---对象初始化过程顺序分析(子父类)

2017-03-30 14:33 204 查看
class Fu

{

int num=9;

Fu()

{

System.out.println("fu constructor run");
show();
}
void show()
{
System.out.println(num);

}


}

class Zi extends Fu

{

int num=8;

{

System.out.println(“constructor code…”+num);

}

Zi()
{
System.out.println("zi constructor..."+num);
}
void show()
{
System.out.println("zi show..."+num);

}


}

class Test

{

public static void main(String[] args)

{

new Zi ();

}

}

正如上边所写的,初始化过程是按着super-显示初始化-构造代码块初始化-构造函数初始化这样大体的过程。

上述例子中,过程如下:

定义子类对象new Zi,此时num默认初始化为0—-

找到Zi构造函数,第一行是隐藏的super();—–

到父类Fu,父类中同样有隐藏的super,指向Objecet,当然没什么影响—-

回到父类进行显示初始化num=9—-

构造代码块没有就进行父类的构造函数初始化即输出fu constructor run

调用show(),因为子类中show方法对该方法进行了覆盖,就执行子类show,输出zi show…0(注意我就是在这蒙的,认为应该是num的值应该是9,后来才想到上边父类在int num=9时只是在栈内存中短暂出现并未改变对象中的num初始值,就算是父类那个时候接着调用,也是优先用栈内存中的num9,回到子类中,num=9就已经弹栈了)—-

然后是子类super结束后执行显示初始化num=8—-

构造代码块初始化输出constructor code…8—-

构造函数初始化输出zi constructor…8

最终输出的结果

fu constructor run

zi show…0

constructor code…8

zi constructor…8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 子父类 初始化