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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨华威 中级黑马   /  2012-3-18 12:09  /  2747 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码如下:
class Super
{
        int i=0;
        public Super(String s)
        {
                i=1;
        }
}
class  Demo extends Super
{
        public Demo (String s)
        {
                i=2;
        }
        public static void main(String[] args)
        {
                Demo d = new Demo("yes");
                System.out.println(d.i);
        }
}


//错误: 无法将类 Super中的构造器 Super应用到给定类型

为什么?

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

7 个回复

倒序浏览
class Super
{
        int i=0;
        public Super(String s)
        {
                i=1;
        }
}
class  Demo extends Super
{
        public Demo (String s)
        {
                           super(s);//应该调用父类的构造函数给子类初始化
               // i=2;
        }
        public static void main(String[] args)
        {
                Demo d = new Demo("yes");
                System.out.println(d.i);
        }
}

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
创建子类是只是调用父类默认的构造器(没有参数) 如果父类上有多个构造器,子类创建时要指明掉用父类的哪个构造器。应该写class  Demo extends Super
{
        public Demo (String s)
        {
                super(2);
                i=2;
        }
        public static void main(String[] args)
        {
                Demo d = new Demo("yes");
                System.out.println(d.i);
        }
}
或在父类上加以个无参数的构造器 public Super(){}

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
  1. class Super
  2. {
  3.         int i=0;
  4.         public Super(){}            
  5.         public Super(String s)
  6.         {
  7.                 i=1;
  8.         }
  9. }
  10. class  Demo extends Super
  11. {
  12.         public Demo (String s)
  13.         {
  14.                 //super();   默认会去调用父类空参数的构造函数
  15.                 i=2;
  16.         }
  17.         public static void main(String[] args)
  18.         {
  19.                 Demo d = new Demo("yes");
  20.                 System.out.println(d.i);
  21.         }
  22. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
在子父类构造函数中,给子类对象初始化时,子类构造函数第一行有一句默认的父类空构造函数,你不指定调用父类的那一个构造函数,它就会默认为父类中空构造函数
而你在父类中没有定义空构造函数,所以编译会失败,你想用父类的构造函数你可以指定代码如下:
public Demo (String s)
{
        super(s);
        i=2;
}
回复 使用道具 举报
一个类如果给他指定了有参数的构造函数,那么就没有默认的构造函数了,
必须显示加上;在new子类时,子类会默认调父类的默认构造函数来创建父类(也就是说,子类的构造方法中默认有这样的代码:super()),也可以通过super来调用父类的非默认的构造函数,但必须传参数.
回复 使用道具 举报
蒙武辉 发表于 2012-3-18 12:18
class Super
{
        int i=0;

父类Super也没有d初始化啊
回复 使用道具 举报
杨华威 发表于 2012-3-19 08:56
父类Super也没有d初始化啊

1关于构造函数再调用super
//super()是隐士调用的
//如果有参数自己必须要把参数加进去 所以解决方法1   super( s)
2当默认调用super(),而父类已经有了有参构造函数而没有无参构造函数的时候这样就出错  可以给父类加个无参构造函数;(也可以直接子类写个 调用this())
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马