2 couragegeorge CourageGeorge 于 2015.07.13 19:21 提问

java子类构造方法的问题--必须要先调用父类的构造方法么?

好像有这样一说法在子类的构造方法中,如果没有调用父类的构造方法,就会默认加一个super()
如果父类没有这一构造方法,就会报错。我想问java在子类的构造方法时候是先检验是否能生成父类的对象还是先检测是否调用了该子类的其他构造方法,因为我这样试了试通过了编译。图片说明

6个回答

tongyi55555
tongyi55555   2015.07.13 20:59
已采纳

我的理解是18-19之间是没有调用的,因为下面的这句话就说明了19行的内容其实是等价于直接执行三个参数的构造方法,真正需要执行super的是在这三个参数的构造方法中。

this("George", 10, school);
devmiao
devmiao   Ds   Rxr 2015.07.13 23:11

是的,但是默认会调用无参数的构造函数。如果你没有定义无参数的构造函数但是定义了别的构造函数,就需要自己去调用super了。

Evankaka
Evankaka   Ds   Rxr 2015.07.13 22:13

你上面的程序是没问题,但是这里要注意。默认的无参构造函数没有生成了。如果生成
Student student=new Student();会报错。所有重载了有参的构造函数,一般最好也把无参的自己写上。当然,里面第一句就是super()

frank_20080215
frank_20080215   2015.07.13 23:35

子类的构造方法中,如果没有调用父类的构造方法,就会默认加一个super()。
那么调用父类的构造方法就是默认构造函数

SunliyMonkey
SunliyMonkey   2015.07.13 19:33

你这样编译没有问题呀。

默认情况下,如果类中没有构造函数,其自带一个没有参数的构造函数。(首先super(),一般情况下都没有错)

我觉得你可以这样理解:

继承父类, 就获得其成员变量,成员函数的使用。
因此需要对这些成员变量做一些初始化工作。
这个从逻辑上是应该如此的。
父类初始化完成后,再接着初始化本身的成员变量。

而编译器,为了防止你遗忘这个逻辑顺序。也许就添加了一个检查规则: 查看子类的构造函数中是否有父类的构造函数

CourageGeorge
CourageGeorge 我想问一下18与19行之间执行了super()了没 应该是是没有 因为父类的构造方法被重载。这是不是可以说明并不是必须先检测父类的构造方法 只要检测在生成子类之前父类已经被构造就ok
2 年多之前 回复
YYWW1110
YYWW1110   2017.06.13 22:18

class Student extends Person {
private String school;
Student (String name,String school){

    //this(name,school,"beijing");
        super();
}
Student(String n,String l,String school){
    super(n,l);
    this.school = school;
}
public String info(){
    return super.info()+"school:"+school;
}

}
同样的问题 ,不解

Csdn user default icon
上传中...
上传图片
插入图片