overrides 问题

来源:百度知道 编辑:UC知道 时间:2024/06/25 03:12:26
public class Super{
public Super(){
m();
}
public void m(){
}
}

final class Sub extends Super{
private final int i;

Sub(){
i = 5;
}

public void m(){
System.out.println(i);
}

public static void main(String[] args){
Sub s = new Sub();
s.m();
}
}

这段代码的输出为什么是0和5

Sub s = new Sub() 时,会先执行父类的构造方法super(),super()又调用m(),此时m()被子类重载,此时定义的i虽然没有具体赋值,但是int类型默认为0,所以输出0.然后执行子类sub(),s对象调用m()输出5.

第二个5很好理解 第一个0是因为java在初始化的时候会先把每个成员变量初始化为二进制的0 而执行new Sub(); 由于多态所以执行了Sub的
public void m(){
System.out.println(i);
}
方法 打印出Sub的i 而此时Sub还没有初始化 所以打印出的i为0

ls说得很对啊。
就是i初始化是0。你执行Sub s = new Sub(); 的时候默认首先执行父类构造方法
public Super(){
m();
}
所以就先输出了0

因为sub子类继承了父类。java虚拟机运行时,先找到父类的方法,然后再运行子类的方法。