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

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

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

this("George", 10, school);

你这样编译没有问题呀。

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

我觉得你可以这样理解:

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

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

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

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

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

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;
}

}
同样的问题 ,不解

这个编过没问题,java要求在构造函数中,只要有父类构造函数调用就可以。
Student(String school)构造函数中,首先调用的就是另一个构造函数Student (String name, int age, String school),在这个构造函数中,又调用了super(name,age),所以相当于调用了父类构造函数。
如果去掉super(name,age), 再编译就会报错了。
Test.java:21: error: constructor Person in class Person cannot be applied to given types;
Student (String name, int age, String school){
^
required: String,int
found: no arguments
reason: actual and formal argument lists differ in length
1 error

所以如果重载了父类的构造函数,也最好留一个参数为空的默认构造函数。