java小问,关于子类覆盖父类成员方法的问题

来源:百度知道 编辑:UC知道 时间:2024/05/26 03:45:56
public class First {
void test()
{
System.out.println("sssss");
}
First()
{//(1)首先执行父类构造方法
System.out.println("before test()");
test();
System.out.println("after test()");
}

public static void main(String args[])
{
new Atest();
First p = new First();
}

}
class Atest extends First{
private int i=2;//(2)使成员变量进行初始化
void test(){
System.out.println("testAbstract()"+i);
}
public Atest(){//(3)调用子类构造方法
System.out.println(""+i);
}
}
对于System.out.println("testAbstract()"+i); 输出的为什么是0呢?
谢谢

这里考虑覆盖关系还要考虑类的初始化顺序
这里其实是涉及类的初始化。
因为有继承关系,所以它在调用子类Atest()构造器前,先调用了父类的构造器,有个隐藏的 super();调用,但因为test()被覆盖,它会调用子类的test(),这时子类的成员变量只是定义,还未进行初始化赋值,而int型的默认初始值为0,如果你把i变成String型,你会发现第一次输出为null

public static void main(String args[])
{
new Atest();
First p = new First();
}
你那把main中全部贴出来啊

貌似是你的 main 不能定义在父类里面吧

因为调用的顺序是 父类的构造函数 -〉子类的构造函数
其中对成员变量的赋值是在构造函数执行的时候进行的。
也就是说构造 Atest的时候的调用顺序是

//First()
System.out.println("before test()");
test();
System.out.println("after test()");
//private int i=2
i=2;
//Atest()
System.out.println(""+i);

因此在执行test()的时候i还没有赋值,默认就是0了