这时注释之前的。
class Fu
{
int a = 2;
public void test()
{
System.out.println("Fu= " + a);
}
Fu()(3)
{
this.test();(4)
}
}
class Zi extends Fu
{
int a = 3;//这句话注释了结果完全不一样(注释前是0,3 注释后是2,2)想不明白,求解,最好将程序执行顺序列一下!!!
Zi()//隐式默认构造函数,为了好理解,给你添加上去的。(2)
{
super()
}
public void test()(5)
{
System.out.println("Zi=" + a);
}
}
class Demo2
{
public static void main(String[] args)
{
Zi z= new Zi();(1) new一个子类对象,然而zi()后面是空参数的,由于zi类没有定义带参数的构造函数,那么默认的构造
函数就还存在,这时zi()就会去(2)这里的默认构造函数,注意:子类的所有构造函数中的第一行,默认都有一条隐式的语句,就是super().所
以就会去(3)这里调用Fu()类的构造函数,由于父类的构造函数里面是this.test() 这个this的意思就是谁调用它,它就代表谁,现在是zi类在
调用它,所以this就代表了zi类,这时就执行子类的test方法,为什么int a = 3;这里为什么不输出是3呢?因为这时的a在堆内存里的默认初
始化值是0,由于还没有得到初始化,所以输出的a值是0 。最后一步再执行z.test()方法,这时z由于获得了a的地址,所以a的默认初始化值原
本的0就会改变为3.所以输出的结果是0和3.
z.test();(6)
}
}
————————————————————————————————————————————————————————
这时注释之后的。
class Fu
{
int a = 2;
public void test()
{
System.out.println("Fu= " + a);
}
Fu()(3)
{
this.test();(4)
}
}
class Zi extends Fu
{
//int a = 3;//这句话注释了结果完全不一样(注释前是0,3 注释后是2,2)想不明白,求解,最好将程序执行顺序列一下!!!
Zi()//隐式默认构造函数,为了好理解,给你添加上去的。(2)
{
super()
}
public void test()
{
System.out.println("Zi=" + a);
}
}
class Demo2
{
public static void main(String[] args)
{
Zi z= new Zi();(1)//前面的(1)(2)(3)(4)步骤,我就不详细讲了,和上面一样的。由于你把子类的成员变量a给注释了,还
有子类继承了父类,所以子类就去指访问父类的成员变量a。所以最后输出的2和2.
z.test();
}
}
|
|