JAVA中子类继承父类时构造方法的继承问题(包括有参无参的情况)
程序员文章站
2022-05-14 11:57:02
...
当创建一个子类对象时,该对象是如何构造的呢?
我们先做一个测试
public class TestPersonStudentDemo1 {
public static void main(String[] args) {
Student s = new Student();
}
}
class Person {
String name;
int age;
// 父类的构造方法
public Person() {
System.out.println("1.public Person(){}");
}
}
class Student extends Person {
String school;
// 子类的构造方法
public Student() {
System.out.println("2.public Student(){}");
}
}
运行结果为:
1. public Person(){}
2. public Student(){}
从程序输出结果中可以发现,虽然程序第3行实例化的是子类的对象,但是程序却先去调用父类中的无参构造方法,之后再调用了子类本身的构造方法。所以由此可以得出结论,子类对象在实例化时会默认先去调用父类中的无参构造方法,之后再调用本类中的相应构造方法。
实际上在本范例中,在子类构造方法的第一行默认隐含了一个super()语句,上面的程序如果改写成下面的形式,也是可以的:
class Student extends Person{
String school ;
// 子类的构造方法
public Student(){
super() ; //实际上在程序的这里隐含了这样一条语句
System.out.println("2.public Student(){}");
}
}
继承条件下构造方法调用规则如下:
1.如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下写不写super()语句效果都是一样;注意:若父类重写了有参的构造方法而且未显式的写出无参的构造方法,此时父类中的无参构造方法被覆盖了,此时在子类的构造方法中必须显式的写出super.(参数1,参数2…),且必须写在子类构造方法的第一行,否则编译器会报错。
2.如果子类的构造方法中通过super显示调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法;
3.如果子类的构造方法中通过this显示调用自身的其他构造方法,在相应构造方法中应满足以上两条规则;
特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行*父类Object类的无参构造方法为止。
上一篇: 一个查看session内容的函数
下一篇: PHP 金额数字转换成英文