黑马程序员技术交流社区
标题:
继承问题
[打印本页]
作者:
杜加璇
时间:
2013-4-4 09:09
标题:
继承问题
本帖最后由 杜加璇 于 2013-4-5 20:56 编辑
class Father
{
String name="tom";
Father(){
System.out.println("father 构造");
}
}
class Son extends Father
{
String name="james";
int age;
Son(){
System.out.println("son 构造");
}
}
既然子类继承了父类的属性,为什么不能继承父类的构造函数,继承执行父类构造创建新的子类对象应该可以啊求解释
作者:
赵晓东
时间:
2013-4-4 09:26
class Father
{
String name="tom";
Father(){
System.out.println("father 构造");
}
}
class Son extends Father
{
String name="james";
int age;
Son(){
//super();//这里有一个隐式的super默认调用了父类的构造函数,一般情况下这个super都是在子类构造方法的第一行
System.out.println("son 构造");
}
}
class Vo
{
public static void main(String[] args)
{
Son s = new Son();
}
}
复制代码
QQ截图20130404092725.png
(1.34 KB, 下载次数: 11)
下载附件
2013-4-4 09:26 上传
作者:
黑马李超
时间:
2013-4-4 09:28
子父类的构造函数的名称都不同怎么能继承 你不能用父类名的构造函数来初始化子类的对象吧
作者:
影响力147753321
时间:
2013-4-4 09:34
构造函数不能继承,只是调用而已。因为子类继承父类的时候,先运行父类构造函数;具体的说就是运行父类时就会先“调用”父类的构造函数,注意“调用”和继承不是一个含义,实质上是“自动运行”。
如果父类没有无参构造函数
创建子类时,不能编译,除非在构造函数代码体中第一行,必须是第一行显示调用父类有参构造函数
作者:
王杰123
时间:
2013-4-4 09:43
package qq.com;
class Father {
String name = "tom";
Father() {
System.out.println("father 构造");
}
}
public class Son extends Father {
String name = "james";
int age;
Son() {
super();//子类会默认调用父类的构造函数,并且放在第一行。
System.out.println("son 构造");
}
public static void main(String[] args) {
Son s = new Son();
}
}
/*
* 对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,
* 当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,
* 父类的非静态代码块执行完毕,接着执行父类的构造方法;
* 父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。
* 子类的非静态代码块执行完毕再去执行子类的构造方法。
* 总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
*/
作者:
王杰123
时间:
2013-4-4 09:43
package qq.com;
class Father {
String name = "tom";
Father() {
System.out.println("father 构造");
}
}
public class Son extends Father {
String name = "james";
int age;
Son() {
super();//子类会默认调用父类的构造函数,并且放在第一行。
System.out.println("son 构造");
}
public static void main(String[] args) {
Son s = new Son();
}
}
/*
* 对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,
* 当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,
* 父类的非静态代码块执行完毕,接着执行父类的构造方法;
* 父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。
* 子类的非静态代码块执行完毕再去执行子类的构造方法。
* 总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
*/
作者:
HM张勇
时间:
2013-4-4 09:47
在子类的构造函数的第一行有一句隐式的super(),引用了父类的构造函数。
Son()
{
//super();
System.out.println("son 构造");
}
所以输出结果是
father 构造
son 构造
作者:
庄生晓梦
时间:
2013-4-4 17:05
class Fu
{
Fu()
{
System.out.println("fu run");
}
}
class Zi extends Fu
{
Zi()
{
super();//隐式语句
System.out.println("zi run");
}
}
class EnxtedsDemo
{
Zi z = new Zi();
}
子类在对对象初始化时,要先访问依稀父类中的构造函数;没有继承
作者:
黄玉昆
时间:
2013-4-4 23:17
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2