黑马程序员技术交流社区

标题: 构造函数的问题 [打印本页]

作者: 张翼    时间: 2011-11-12 19:15
标题: 构造函数的问题
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();
}
怎么又不能编译呢?
作者: 宋文轩    时间: 2011-11-12 19:17
本帖最后由 宋文轩 于 2011-11-12 19:27 编辑

这要是你全部的代码的话 问题就在于缺大括号
如果你补全大括号的话 子类继承了父类,但是父类并没有空参数的构造方法,而子类却没有给父类的构造方法传参数,所以编译失败。
解决办法是可以在子类中增加构造函数 J_Test(int i){  来给父类的构造方法传参数。
                                                                    super(i)
                                                                 }
作者: 咖啡    时间: 2011-11-12 20:08
你的子类继承了父类,仅仅是生成了一个对象,没有传递参数,除非你去调用父类的方法或者重写父类的方法,a.class J_Test
就可以编译了
作者: 魏兴发    时间: 2011-11-12 20:35
因为当调用子类构造器来初始化子类对象时,父类的构造器总会在子类构造器之前执行。而你的父类的构造器只有一个,且要求传入一个参数,肯定会报错了,所以你应该写一个无参构造器。这样就能运行了!!创建任何Java对象,最先执行的总是jav.lang.Object类的构造器。{:soso_e100:}
作者: 坚强    时间: 2011-11-12 21:08
  毕老师的视频摘要:

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

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

都默认有这一行


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


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

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

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


  没有父类的会类,有一个共同的父类Object

作者: 史晓霞    时间: 2011-11-12 22:00
父类J_Test缺少无参构造函数,子类J_SubClass虽然没有自定义的构造方法,它里面有个默认的无参构造方法,而这个方法里有调用父类的无参构造方法,而父类里并没有无参构造方法
作者: 别让生命去等待_    时间: 2011-11-12 22:46
父类写了有参数的构造函数,所以就没有隐式的J_Testr(){}了,而子类需要继承父类,就要对父类进行初始化,就需调用父类的构造函数,所以就要写
super(这里随你写什么整数);
作者: quanhui    时间: 2011-11-13 12:45
而在实例化时new J_SubClass()对象,会调用J_SubClass类的无参构造函数,由于继承的特点,子类在构造函数中必须要通过super();语句访问父类中的构造函数,若父类中定义了带参的构造函数,则需要在子类中手动指定要调用父类的哪个构造函数.所以,在J_SubClass的无参构造方法中super()会执行,但是父类没有无参的构造函数,所以编译时会报错.只要在父类中加入一个无参的构造函数,或者在子类中加入一个构造函数,并指定调用父类的带参构造函数即可.
作者: 王新春    时间: 2011-11-13 13:59
这是因为你创建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);
}
}
这样就可以调用父类的构造函数了,也能编译。
作者: 刘博    时间: 2011-11-13 14:05
进来看看学习下:lol




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