A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© biebie 中级黑马   /  2014-12-11 22:21  /  1691 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看下面的代码,选择正确的结论:
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呢???

3 个回复

倒序浏览
创建对象时,因为i不是静态的所以在内存中i只有初始化的值0。
所以在创建对象后,你的想法是对的,i的值最后变成2,
但是在对象调用i后,那么就会对i进行赋值,所以就又变成了8.
回复 使用道具 举报
我追踪了下程序 运行情况:new SubClass()-->SubClass构造函数-->SuperClass构造函数-->add(j)这里执行的是SubClass的add() -->之后定义SubClass的成员变量i,i就又被赋值8
根据追踪推测的不知道对不对!再查查资料
回复 使用道具 举报
因为父类构造函数中add()调用的是子类的add,子类add执行的时候用的是子类的 i,得到 i 的结果也是子类的 i ,跟父类的 i 半毛钱关系都没有。  所以父类中的 i 一直都是8
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马