黑马程序员技术交流社区
标题:
构造函数的一点小问题
[打印本页]
作者:
精彩生活向钱看
时间:
2013-6-7 00:07
标题:
构造函数的一点小问题
各位高手请教一个小问题,请问如果子类继承父类,那么我们都知道子类是要调父类的无参构造的,但是如果子类的构造函数是有参数的,父类的构造函数也是有参数的,那么此时子类怎么调用父类构造呢?还有假如子类的构造是无参的,父类的构造是有参的,那么又是一种什么情况呢?
作者:
王林涛
时间:
2013-6-7 00:25
当构造函数在父类中,是无参时,子类会默认访问父类中无参构造,因为在子类构造方法第一行会有默认的super();
但当父类中写了有参的构造函数时,系统默认的无参构造函数也就没有了!
作者:
小冰块
时间:
2013-6-7 00:44
本帖最后由 小冰块 于 2013-6-7 00:52 编辑
1、子类中
所有的构造函数(不管有参没参)
都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();
2、如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数。
3、如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。
关于第二点,举个例子:
class Fu
{
Fu(int x)
{
System.out.println(x);
}
}
class Zi extends Fu
{
String s = "ok";
Zi()
{
super(4);//------------在这里指定要访问的父类构造函数+参数
}
}
复制代码
作者:
娄田田
时间:
2013-6-7 00:50
1、如果一个类没有构造方法,那么系统会为这个类提供一个无参的默认的构造函数;
2、一旦一个类中定义了其他有参的构造函数,系统将不再提供默认的构造函数;
3、如果父类中定义了有参的构造函数,并且没有显示的定义无参的构造函数,那么它的子类必须在它的构造函数(无论有参还是无参)中的第一行显示的调用super(参数);
4、super(参数)为父类中的某个构造函数。
作者:
孔雀东南飞
时间:
2013-6-7 19:14
楼主:
1、我所理解的子类构造函数调用父类构造函数是这样的:子类在继承父类的时候,是继承非private、非final、非构造函数的,但是,在父类的非默认构造函数中有可能会对父类的成员进行一些赋值,也就是初始化过程,而子类又不能继承父类构造函数,因此子类继承的成员都是父类构造函数初始化后的(你可以想一想,如果子类不继承父类构造函数,而子类继承成员后,父类构造函数又对父类成员赋值了,那么子类继承的成员与父类的成员不一致了,那还叫继承吗,因此子类继承父类,必须先用父类构造函数初始化父类成员)
2、子类构造函数内第一行用super无参数或带参数,其实另一种含义就是父类的构造函数中已经有一些功能了,而子类构造函数中要做同样的功能,因此子类构造函数中的代码可以不写了,而是直接调用父类的构造函数,用的是它的功能。
话说的比较绕,不知你明白没?演示下2的代码
class Fu
{
int age;
Fu(int age)
{
this.age = age;
}
Fu()
{
}
}
class Zi extends Fu
{
Zi(int age)
{
super(age);//这里属于Zi 的this.age = age ;就可以不写了,直接调用父类构造函数功能就可以了
//不用super(age)的话是下面代码
super();
this.age = age;//这里的this.age是属于Zi 的
}
}
作者:
钟成军
时间:
2013-6-8 00:37
楼上的几位大哥都解释的非常详细,我也正有此问题,嘿嘿
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2