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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值