欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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类的无参构造方法为止。

相关标签: Java java