黑马程序员技术交流社区

标题: 终于有道题可以放上来了 [打印本页]

作者: xc29417412    时间: 2015-1-14 00:01
标题: 终于有道题可以放上来了
class Fu{
        int num = 5;                                 
        Fu(){                                                                               
               // System.out.println(num);                       
                                show();                              
                System.out.println(num);              //为什么结果是0  5
        }         

不会啊
        void show(){                                     0   
                                                        5
                System.out.println("55");
        }
}
class Zi extends Fu{
        int num = 3;

                 Zi(){}  

        void show() {                                
                                        System.out.println(num);                               
                                        }
}
class Demo3 {
        public static void main(String[] args) {
                Zi z = new Zi();                                   
                //Zi z = (Zi)f;
                //f.show();
        }
}

作者: kakasa    时间: 2015-1-14 02:19
子类创建对象前,先访问父类构造函数,这你应知道。
这里创建的是子类对象(不管引用是谁),就意味着子类的show方法已经复写掉了父类的show方法。
也就是说父类的构造函数中调用的show方法是子类的show。
这里show方法调用的是num是子类的成员num,所以父类构造函数调用show的时候子类的num还没有被初始化,只有默认初始化值也就是0。

我以为是3和5
但是从运行结果可以看得出,子类对象的成员显示初始化前,就先访问父类构造函数。
具体为什么这样我就不得而知了。

作者: xc29417412    时间: 2015-1-15 20:52
晕死,这道题有点难度啊。考的是对内在结构的理解啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2