java继承发现的问题。

 public class Demo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Zi z=new Zi();
    }
}

class Fu{
    int num = 30;
    Fu(){
        show();
    }
    public void show(){
        System.out.println(num);
    }
}

class Zi extends Fu{
    int num = 20;
    public void show(){
        System.out.println(num);
    }
}

请大神详细解释一下为什么会输出0,真的很想知道,请尽量详细,谢谢了。

你先看,你输出数字这个函数是在构造函数里面调用的,而在构造一个对象时首先调用的是构造函数,而此时的num还没赋值!(所以继承应该不是错误所在,尽管你直接构造一个Fu对象时,它输出的应该还是0)

以前遇到过这种问题,应该是初始化顺序的原因,具体的原因忘了,你可以上网查一些Java类加载时初始化的顺序有关的东西

Java不清楚,但是C#是这样的,估计Java类似:
给成员变量初值的代码其实是编译器自动放在构造函数里的,并且可能后于你的构造函数执行。
在C#中一个守则是,不能在构造函数中调用赋初值的成员变量,也不要在成员变量赋初值的时候访问另一个成员变量。

这是JAVA上典型的匿名内部类的写法,在执行时,先调用父类的show方法,然而父类与子类的方法相同,就去调用子类的方法,在调用子类方法是子类的num并没有被实例化,如果子类的num前面加个static就会保持数值的不便,也就获得10的数值,不知道楼主是否明白??

构造函数被调用时变量还没初始化