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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

李秀昂

初级黑马

  • 黑马币:0

  • 帖子:12

  • 精华:0

© 李秀昂 初级黑马   /  2012-9-9 20:06  /  1504 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李秀昂 于 2012-9-12 18:28 编辑

这是代码:
class BigDog {
        
    BigDog(){
        
        run();   //为什么调用了子类的方法?是哪个对象调用了它?
    }
    void run(){
        System.out.println("BigDog run");
    }
}
class SmallDog extends BigDog {
   
    private String name = "WangCai";
    SmallDog(String name) {
        this.name = name;
        run();
    }
    void run(){
        System.out.println("SmallDog run:"+name);
    }
}
public class Test {
    public static void main(String[] args)
    {
        SmallDog d1 = new SmallDog("LaiFu");
    }
   
}
这是结果:
SmallDog run: null
SmallDog run: LaiFu
我主要有两个问题:
1,为什么输出的第一句name的值为null?而不是“WangCai”?
2,方法之前不写对象名,默认是哪个对象调用它的?(父类中无参构造函数中的run()方法)

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

4 个回复

倒序浏览
如果我没有看错的话,你好像是用Java写的吧
回复 使用道具 举报
父类的构造函数不被调用吗?
回复 使用道具 举报
本帖最后由 霍永刚 于 2012-9-10 06:37 编辑

这是代码:
class BigDog {
        
    BigDog(){         当你new一个对象时虚拟机会自动找一个无参数的构造方法
        
        run();   //为什么调用了子类的方法?是哪个对象调用了它?   //调用子类里面的void run()第一次打印;因为子类重写了父类的void run()方法
    }
    void run(){
        System.out.println("BigDog run");
    }
}
class SmallDog extends BigDog {
   
    private String name = "WangCai";    默认的是wangcai
    SmallDog(String name) {       值传进来了lifu把王才覆盖了
        this.name = name;
        run();
    }
    void run(){
        System.out.println("SmallDog run:"+name);    第二次打印输出了一句lifu
    }
}
public class Test {
    public static void main(String[] args)
    {
        SmallDog d1 = new SmallDog("LaiFu");   //你new一个对象把lifu传进去
    }
   
}

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
李 玉林 来自手机 中级黑马 2012-9-10 12:41:23
报纸
我用C#写了下  父类的run方法在子类中重写后 可以正常输出,  当子类实例化时,调用父类无参数的构造函数,这时在父类中调用了一次子类的run方法,由于子类实例话的name还没有传过来,所以输出的是默认值,第二次打印的时候,子类实例化的name传过来把默认值覆盖.所以输出了实例化的name

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马