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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张翼 黑马帝   /  2011-11-12 19:15  /  2706 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class J_SubClass extends J_Test
{
}
public class J_Test
{
    J_Test(int i)
     {
         System.out.println(i);
      }
public static void main(String argv[])
{
     J_SubClass a=new J_SubClass();
}
怎么又不能编译呢?

9 个回复

正序浏览
刘博 黑马帝 2011-11-13 14:05:07
10#
进来看看学习下:lol
回复 使用道具 举报
王新春 黑马帝 2011-11-13 13:59:01
9#
这是因为你创建J_SubClass a = new J_SubClass();是调用的是默认的无参构造函数,而父类中定义的构造函数是有参数的构造函数,所以才出现问题,而不能编译的可以这样修改如下:
class J_SubClass extends J_Test{


J_SubClass(int i) {
super(i);
}

}




public class J_Test {
J_Test(int i) {
System.out.println(i);
}

public static void main(String argv[]) {
J_SubClass a = new J_SubClass(1);
}
}
这样就可以调用父类的构造函数了,也能编译。
回复 使用道具 举报
quanhui 黑马帝 2011-11-13 12:45:12
8#
而在实例化时new J_SubClass()对象,会调用J_SubClass类的无参构造函数,由于继承的特点,子类在构造函数中必须要通过super();语句访问父类中的构造函数,若父类中定义了带参的构造函数,则需要在子类中手动指定要调用父类的哪个构造函数.所以,在J_SubClass的无参构造方法中super()会执行,但是父类没有无参的构造函数,所以编译时会报错.只要在父类中加入一个无参的构造函数,或者在子类中加入一个构造函数,并指定调用父类的带参构造函数即可.
回复 使用道具 举报
父类写了有参数的构造函数,所以就没有隐式的J_Testr(){}了,而子类需要继承父类,就要对父类进行初始化,就需调用父类的构造函数,所以就要写
super(这里随你写什么整数);
回复 使用道具 举报
父类J_Test缺少无参构造函数,子类J_SubClass虽然没有自定义的构造方法,它里面有个默认的无参构造方法,而这个方法里有调用父类的无参构造方法,而父类里并没有无参构造方法
回复 使用道具 举报
坚强 黑马帝 2011-11-12 21:08:28
报纸
  毕老师的视频摘要:

3 构造函数
            在对子类对象进行初始化时,父类的构造函数也会运行
            那是因为子类的构造函数默认第一行有一条隐式的语句

super();会访问父类中空参数的构造函数,且子类中所有的构造函数

都默认有这一行


  super(函数)必须放在第一行   和在构造函数内访问本类函数用
this(函数)一样  在第一行


  子类中所有的构造函数默认都会访问父类中的空参数构造函数
  当父类中没有空参数的构造函数时,子类必须手动通过super指定要访

问的构造函数,当然子类的构造函数的第一行可以手动指定this类访问本

类中的构造函数,但是子类中要保证有构造函数去访问父类中的构造函数


  没有父类的会类,有一个共同的父类Object
回复 使用道具 举报
因为当调用子类构造器来初始化子类对象时,父类的构造器总会在子类构造器之前执行。而你的父类的构造器只有一个,且要求传入一个参数,肯定会报错了,所以你应该写一个无参构造器。这样就能运行了!!创建任何Java对象,最先执行的总是jav.lang.Object类的构造器。{:soso_e100:}
回复 使用道具 举报
咖啡 黑马帝 2011-11-12 20:08:20
藤椅
你的子类继承了父类,仅仅是生成了一个对象,没有传递参数,除非你去调用父类的方法或者重写父类的方法,a.class J_Test
就可以编译了
回复 使用道具 举报
本帖最后由 宋文轩 于 2011-11-12 19:27 编辑

这要是你全部的代码的话 问题就在于缺大括号
如果你补全大括号的话 子类继承了父类,但是父类并没有空参数的构造方法,而子类却没有给父类的构造方法传参数,所以编译失败。
解决办法是可以在子类中增加构造函数 J_Test(int i){  来给父类的构造方法传参数。
                                                                    super(i)
                                                                 }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马