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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© demown 中级黑马   /  2014-4-14 10:35  /  1608 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  class Super
{
     int i = 0;
     public Supre(String s)
     {
          i = 1;
      }
}
  class Demo extends Super
  {
   public Demo(String s)
   {
      i = 2 ;
   }
    public static void main(String[] ages)
    {
           Demo d = new Demo(“yes”);
           System.out.println(d.i);
    }
  }



你上代码是毕老师讲的实力题
问输出结果:
毕老师答的是:  编译失败,因为父类中缺少空参数的构造函数。或者子类应该通过super语句指定要调用的父类中 的构造函数。

   但是在之前老师讲构造函数的时候不是说 每个类都一个空参数构造函数,如果自己没有定义系统会帮你加一个没有参数的构造函数为啥现在又说缺少
空参数的构造函数。求解为啥会这么答.

评分

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

查看全部评分

5 个回复

倒序浏览
类中如果不显示的定义构造函数,底层会默认加一个空参数的构造函数,如果,你显示的定义了一个带参数的构造函数,那么就不会有空参数的构造函数了!子类的构造函数的第一行会隐式的有一个super()可是父类中没有空参数的构造函数,所以就会报异常!要么你在父类中加入super(){},或者,你在子类的构造函数中加入super(s),否则一定会报异常

评分

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

查看全部评分

回复 使用道具 举报
一般在子类的构造函数第一行会默认调用父类的构造函数suer();而如果父类的构造函数被重写了,那么这个时候也就没有了super(),则子类必须在构造函数第一行加上调用的父类钩子函数,如下面的例子
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[] ages)
    {
           Demo d = new Demo("yes");
           System.out.println(d.i);
    }
  }

评分

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

查看全部评分

回复 使用道具 举报
一点想法:
    先牢记。子类的构造过程中,必须 调用其父类的构造方法。有两种实现方法:
1、super(); 默认调用父类无参数的构造方法。可以省略。(父类没写构造方法,系统加上默认无参构造方法)
2、super(参数列表);来调用父类有参数的构造函数。不可以省略。
上述两种必须实现一种。
你的例子来说。
毕老师答的是:  编译失败,因为父类中缺少空参数的构造函数或者子类应该通过super语句指定要调用的父类中的构造函数。
其实就是说的两种实现方式。
例子代码中,父类构造函数是有自定义,有参的。所以子类构造函数应该通过super语句带参数来指定要调用的父类构造函数。
或者给父类加上无参构造函数,此时子类构造函数中省略super(); 调用父类无参构造函数。

评分

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

查看全部评分

回复 使用道具 举报
因为你对子类无参数构造函数重写了,那么只要是子类构造函数那么他的第一行一般一定是默认的super();但是你对父类的构造函数重写了,那么这个时候就必须得手动写你子类构造函数要调用父类哪个构造函数了

总结只要是子类那么它的所有构造函数都会第一行调用父类的构造函数super(),如果父类的构造函数被重写了,那么这个时候必须在子类的构造函数第一行手动加上要调用的父类构造函数,也许这个时候你想到如果父类是抽象类这个时候还会写父类构造函数吗,答案是肯定的,因为构造函数式用来初始化的,虽然抽象父类不能被实例化但是我们只是用它的构造函数初始化而已,而只有new的时候才会返回一个对象,所以和这个抽象类不能被实例化一点不矛盾

评分

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

查看全部评分

回复 使用道具 举报
类是必须有构造方法的,你不写,编译器找不到,不知道怎么构造你的类,所以只能给你一个什么都不操作的默认构造方法,
但是如果你写了构造方法,编译器找到了一个合法的构造方法,就没有必要给您添加一个构造方法了,所以这时候你写的类有且只有一个带参的构造方法,这时候你却要调用一个无参的构造方法,自然报错了

评分

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

查看全部评分

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