黑马程序员技术交流社区

标题: 继承的一道题,求解 [打印本页]

作者: biebie    时间: 2014-12-11 22:21
标题: 继承的一道题,求解
看下面的代码,选择正确的结论:
class SuperClass
{
    int i=8 ;
    SuperClass()
    {
       add(1);
    }
void add(int j)
{
  i=i+j;
}
}
class SubClass extends SuperClass
{
int i=8;
    void add(int j)
    {
        i=i+2*j;
    }
}
public class MainClass
{
    public static void main(String args[])
    {
        SuperClass a=new SubClass();
        System.out.println(a.i);
    }
}
A 、编译时出现错误    B、运行时出现错误
C、输出 10            D、输出 8

我的理解:子类先去调用父类构造函数,然后执行add(1);执行的是子类中重写的函数。所以得出结果是10.
但是答案是D,为什么是8呢???
作者: 史云龙    时间: 2014-12-11 22:51
创建对象时,因为i不是静态的所以在内存中i只有初始化的值0。
所以在创建对象后,你的想法是对的,i的值最后变成2,
但是在对象调用i后,那么就会对i进行赋值,所以就又变成了8.
作者: 農邨尛夥兒    时间: 2014-12-11 23:25
我追踪了下程序 运行情况:new SubClass()-->SubClass构造函数-->SuperClass构造函数-->add(j)这里执行的是SubClass的add() -->之后定义SubClass的成员变量i,i就又被赋值8
根据追踪推测的不知道对不对!再查查资料
作者: Quasimodo    时间: 2014-12-11 23:32
因为父类构造函数中add()调用的是子类的add,子类add执行的时候用的是子类的 i,得到 i 的结果也是子类的 i ,跟父类的 i 半毛钱关系都没有。  所以父类中的 i 一直都是8




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