日期:2014-05-20  浏览次数:20699 次

关于继承,初始化。。。。。
Java code


class Animal{
    String color="red";
    
    Animal(){
        print();
        color="black";
    }
    
    void print(){
        System.out.println("animal color is "+color);
    }
}

class Cat extends Animal{
    String color="yellow";
    
    Cat(){
        print();
        super.print();
    }
    
    void print(){
        System.out.println("cat color is "+color);
    }
    
    public static void main(String[] args){
        new Cat();
    }
}




结果是:
cat color is null
cat color is yellow
animal color is black


疑问:
1.当子类构造函数去调用父类构造函数时,如果父类构造函数中调用的成员函数被子类覆盖过,那么就用子类?
2.为什么是null? 显示初始化不是优先于构造函数么?当构造函数启动时,成员变量不是已经被显示初始化了么?





------解决方案--------------------
探讨
引用:
1.根据打印出来的结果,可以肯定是这样的。
2.之所以是null是因为当父类调用子类的print方法时,子类的color变量还没有执行初始化。显示初始化……

多谢的你的回答,很不想为这样的问题浪费那么多时间,说不定这辈子也就遇到这一次了,但还是想了解。。:
能否这样理解,当jvm执行到子类构造函数的super()之前,已经做好了什么事?真是太痛苦了遇到”先有鸡还……