黑马程序员技术交流社区

标题: 关于Super出错的问题 [打印本页]

作者: 杨华威    时间: 2012-3-18 12:09
标题: 关于Super出错的问题
代码如下:
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应用到给定类型

为什么?
作者: 蒙武辉    时间: 2012-3-18 12:18
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);
        }
}


作者: 魏群    时间: 2012-3-18 12:25
创建子类是只是调用父类默认的构造器(没有参数) 如果父类上有多个构造器,子类创建时要指明掉用父类的哪个构造器。应该写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(){}
作者: 朱辉    时间: 2012-3-18 12:31
  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. }
复制代码

作者: 刘元明    时间: 2012-3-18 12:33
在子父类构造函数中,给子类对象初始化时,子类构造函数第一行有一句默认的父类空构造函数,你不指定调用父类的那一个构造函数,它就会默认为父类中空构造函数
而你在父类中没有定义空构造函数,所以编译会失败,你想用父类的构造函数你可以指定代码如下:
public Demo (String s)
{
        super(s);
        i=2;
}

作者: OMG    时间: 2012-3-18 15:33
一个类如果给他指定了有参数的构造函数,那么就没有默认的构造函数了,
必须显示加上;在new子类时,子类会默认调父类的默认构造函数来创建父类(也就是说,子类的构造方法中默认有这样的代码:super()),也可以通过super来调用父类的非默认的构造函数,但必须传参数.
作者: 杨华威    时间: 2012-3-19 08:56
蒙武辉 发表于 2012-3-18 12:18
class Super
{
        int i=0;

父类Super也没有d初始化啊
作者: 泮和顺    时间: 2012-3-19 14:04
杨华威 发表于 2012-3-19 08:56
父类Super也没有d初始化啊

1关于构造函数再调用super
//super()是隐士调用的
//如果有参数自己必须要把参数加进去 所以解决方法1   super( s)
2当默认调用super(),而父类已经有了有参构造函数而没有无参构造函数的时候这样就出错  可以给父类加个无参构造函数;(也可以直接子类写个 调用this())




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