class Dog
{
Dog()
{
System.out.println("before Dog run");
run(); /*第三步:访问父类构造函数,当访问到该方法时,因为子类已经将run()方法覆写了,
所以会运行子类的run()方法,而此时还没有给Speed赋值,所以speed的值应该是0;
*/
System.out.println("after Dog run");
}
public void run()
{
System.out.println("Dog run");
}
}
class SmallDog extends Dog//第二步:因为类SmallDog继承了父类Dog,所以子类在访问自己的构造函数之前会先调用父类的构造函数。
{
private int speed = 1;
public SmallDog(int speed)
{
//其实在这里省略了super();
this.speed = speed;
}
public void run()
{
System.out.println("SmallDog run speed="+speed);
}
}
class Zoo
{
public static void main(String[] args)
{
new SmallDog(5);//第一步:在内存中开辟空间创建SmallDog的对象,调用该对象的构造函数。
}
}
所以最后的结果应该是先输出"before Dog run",
在输出子类run()方法的"SmallDog run speed="+speed,而speed=0;
最后输出"after Dog run"。最后结果如下:
before Dog run
SmallDog run speed=0
after Dog run
若是把主函数的new SmallDog(5);改为new SmallDog(5).run();
则结果是
before Dog run
SmallDog run speed=0
after Dog run
SmallDog run speed=5
因为此时已经把5赋值给了speed重新调用了run()方法。
楼上的应该是run()方法调用那里弄错了。 |