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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李海鹏 中级黑马   /  2013-1-13 12:50  /  3044 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李海鹏 于 2013-1-15 20:01 编辑

class Students
{
     Students()
     {
           sop("a");
      }
     Satudents(String name)
    {
         sop("b");
    }
}
class PrimaryStudents extends Students
{
      PrimaryStudents()
     {
           sop(1);
     }
     PrimaryStudents(String name)
    {
          sop(2);
    }
}

main()
{
      PrimaryStudents  ps = new PrimaryStudents();
      PrimaryStudents  ps = new PrimaryStudents("张三");
}
为什么打印的结果不是a1b2呢?而是a1a2???

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

7 个回复

倒序浏览
你的PrimaryStudents继承了Students,构造函数是不继承父类的,要继承的是父类的普通函数。
回复 使用道具 举报
子类实例化时只会调用父类的无参构造函数
回复 使用道具 举报
如果你在希望输出a1b2需要在子类的有参构造函数显示调用父类的有参构造函数,或者把父类的默认无参构造函数去掉,因为当你不显示调用父类构造函数时会默认调用父类的无参构造函数。
回复 使用道具 举报
子类实例化的时候调用的是父类的无参的构造函数,PrimaryStudents  ps = new PrimaryStudents("张三");这句执行的时候,默认会首先会调用Students的无参构造函数输出a,想要输出b的话在你的构造函数中显式调用父类的构造函数将name作为参数传递进去。
PrimaryStudents(String name)
    {
          super(name);
          sop(2);
    }

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
因为当创建一个对象的时候当这个对象有父类的时候他先去初始化父类的构造方法,也就是说在子类的构造函数的第一条语句
里面有个隐式的super();来调用父类的构造函数,因为在子类的构造方法中只有隐式的super();那他也只能调用父类无参
的构造函数 所以先打印a 因为子类没有定义和  Students(String name)所匹配的有参数的super();所以b不打印
父类初始化完后就来初始化子类的构造函数所以 接着打印1
当你再创建一个有参的构造函数的时候 因为在你的子类构造函数里面并没有定义一个匹配的有参super();所以他还是初始化父类无参
构造函数 所以还是打印a 接着初始化子类的有参构造函数 最后打印出2
所以结果是a1a2
  1. class PrimaryStudents extends Students
  2. {
  3.       PrimaryStudents()
  4.      { //其实在这里有个隐式的super();而这个super就是调用的父类无参的构造函数
  5.      //如果想调用父类的有参构造函数的话那必须定义和父类参数相匹配的super(..);语句
  6.          sop(1);
  7.      }
  8.      PrimaryStudents(String name)
  9.     {
  10.          System.out.println("2");
  11.     }
  12. }
复制代码

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
在构造函数的第一行默认加
隐式的 super();
是没有传递参数的

如果想要传递参数的,可以手动
在构造函数的
第一行添加 super(name);
回复 使用道具 举报

PrimaryStudents  ps = new PrimaryStudents();
由于参数为空,调用 PrimaryStudents类的空构造函数,然后构造函数,隐藏了super();语句,因为子类要看父类怎么对数据初始化的,所以调用super();也就是调用了父类的空构造函数,结果显示a1
PrimaryStudents  ps = new PrimaryStudents("张三");
有参数,调用 PrimaryStudents类的有对应参数的构造函数,没指定super(参数);所以默认调用super();调用父类的空构造函数。然后再子类初始化.
结果a2
显示a1a2
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马