黑马程序员技术交流社区
标题:
关于java继承
[打印本页]
作者:
张红
时间:
2012-3-12 17:51
标题:
关于java继承
在java继承中,子类对象在实例化时会默认调用父类中无参构造器,之后在调用本类的构造器。那么如果父类中没有无参构造器,只有有参的构造器,那么子类还会调用它吗?
作者:
黑马连家华
时间:
2012-3-12 17:57
是不是父类中一定会有一个无参构造函数?除非这个构造函数被定义?
我不知道,表听我的,就是讨论
等结果
作者:
倪鹏博
时间:
2012-3-12 18:01
子类的实例化过程:
子类的所有构造函数,默认都会访问父类中的空参数构造函数
因为子类每一个构造函数的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问的父类中的构造函数
当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数
子类中至少会有一个构造函数会访问父类中的构造函数
作者:
赵英坤
时间:
2012-3-12 18:08
不会,如果父类没有无参的构造器,就会调用默认构造器、
默认构造器就是编译器在你没有编写构造方法的时候默认的给你添加的构造器
package DailyTest;
public class Test {
public static void main(String[] args){
son s = new son();
s.get();
}
}
class father{
String s = "";
public father(String s){
this.s = s;
System.out.println("father class" + s);
}
}
class son{
public son(){
}
void get(){
}
}
什么都不输出,就说明没有调用父类有参的构造函数
作者:
adison
时间:
2012-3-13 12:29
在java继承中,子类对象在实例化时会默认调用父类中无参构造函数,因为子类每一个构造函数内的第一行都有一句隐式super();当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数,否则有可能编译失败,就好像下面的代码
class Fu
{
Fu(int x)
{
System.out.println("fu ...."+x);
}
}
class Zi extends Fu
{
Zi(int x)
{
//super(3);
System.out.println("zi..."+x);
}
}
如果没有注释的部分,就会默认调用super();,但在父类中是没这个无参函数的,所以编译失败
补充一下3楼的说法:“子类的构造函数第一行也可以手动指定this()(假设调用空参数)语句来访问本类中的构造函数
子类中至少会有一个构造函数会访问父类中的构造函数”这时必须保证父类中有空参数构造函数(自定义或默认)可以被子类空参数构造函数调用或者在子类空参数构造函数中调用自定义父类构造函数,否则编译失败,
总之,一句话,无论怎样,子类中必须会有至少一个构造函数调用父类构造函数,而且肯定在第一行
作者:
四海为家
时间:
2012-3-13 21:27
本帖最后由 四海为家 于 2012-3-13 21:30 编辑
我想说的也是子类的实例化过程,可能上面的已经有朋友回答过了,但是我觉得我的答案全些:(如果有更全的,希望指点,谢谢)
子父类中的构造函数的特点:
在运行时,发现父类构造方法先运行了,然后才是子类构造函数。只是为什么呢?
原因:是因为类的所有的构造函数中,都有一句默认的隐式语句 super();会默认调用父类中空参数的构造函数。
为什么要有super默认语句呢?因为子类对象在初始化时,必须要到父类先去初始化。
为什么非要到父类中去初始化呢?那是因为,子类继承了父类,可以获取到父类中的数据。
所以在使用父类数据之前,必须要明确父类是如何对自己的成员进行初始化的。
如果父类中的没有空参数的构造函数,那么子类的构造函数就必须手动的通过super语句或this语句指定要访问的父类中的构造函数或者子类中的其他构造函数。
我们要记住的是,super语句而且一定要定义在构造函数的第一行,注意除了Object类中没有super语句,因为它是最顶层了,没有父类了,其他所有类的构造函数都必须有super语句。
作者:
王利强
时间:
2012-3-13 22:22
如果父类的构造函数自己定义了参数,而子类默认的super()代码仍然存在,要么我们在父类中手动定义空参数的构造函数,或者在子类中复写super(参数),来指明其调用的有参数的构造函数,否则的话编译时将会报错。
作者:
冯建鹏
时间:
2012-3-14 00:46
1、子类只继承父类的默认(缺省)构造函数,即无形参构造函数。如果父类没有默认构造函数,那子类不能从父类继承到任何构造函数。
2、子类从父类处继承来的父类默认构造函数,不能成为子类的默认构造函数。
3、在创建对象时,先调用父类默认构造函数对对象进行初始化,然后调用子类自身自己定义的构造函数。
4、如果子类想调用父类的非默认构造函数,则必须使用super来实现。
5、子类必须调用父类的构造函数。可以通过系统自动调用父类的默认构造函数,如果父类没有默认构造函数时,子类构造函数必须通过super调用父类的构造函数。
那么如果父类中没有无参构造器,只有有参的构造器,那么在运行的时候就会报错。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2