继承中子类的构造器调用父类的构造器

本文详细解析了Java中构造器的作用及其实现方式,包括构造器如何初始化对象的成员变量,构造器与子类继承之间的关系,以及如何在子类构造器中调用父类构造器等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构造器的作用:初始化对象的成员变量。

构造器不能被子类继承,普通方法和属性可以被子类继承。

默认情况下,子类的构造器中的第一行隐式地调用父类默认的无参构造器,以初始化父类的成员变量。

因为子类从父类继承过来的方法,可能要用到父类的成员变量,所以需要在子类的构造器中调用父类的构造器以初始化父类的成员变量。

父类People(包含无参构造器(默认构造器)和有参构造器):

class People{
    private String name;
    private int age;
    public People(){
        System.out.println("初始化People的实例变量--无参构造器");
    }
    public People(String name, int age){
        System.out.println("初始化People的实例变量--有参构造器");
        this.name = name;
        this.age = age;
    }
}

子类Student(也有2个构造器):

public class Student extends People{
    private int sno;
    public Student(){
        System.out.println("初始化Student的实例变量--无参构造器");
    }
    public Student(int sno){
        System.out.println("初始化Student的实例变量--有参构造器");
        this.sno = sno;
    }
    public static void main(String[] args){
        Student p1 = new Student();
        Student p2 = new Student(1);
    }
}

执行的结果:

初始化People的实例变量--无参构造器
初始化Student的实例变量--无参构造器
初始化People的实例变量--无参构造器
初始化Student的实例变量--有参构造器

从执行的结果可知:

在子类中不管是有参还是无参构造器,默认情况下均调用父类的无参构造器(即默认构造器)。即以下代码是等价的:

public Student(){

    System.out.println("初始化Student的实例变量--无参构造器");

}

public Student(int sno){

    System.out.println("初始化Student的实例变量--有参构造器");

    this.sno = sno;

}

等价于:

public Student(){

    super();//super语句只能位于构造器的第一条语句

    System.out.println("初始化Student的实例变量--无参构造器");

}

public Student(int sno){

    super();

    System.out.println("初始化Student的实例变量--有参构造器");

    this.sno = sno;

}

super()的作用是:调用父类的默认构造器。

在构造函数中,super语句必须放在第一句。

任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(...);那么Java默认都会调用super();作为父类的初始化函数。所以这里的super();加不加都无所谓。

如果此时将父类的无参构造器注释掉,而子类的构造器隐式或显式调用了父类的默认构造器,程序编译时将会报错,因为只要在父类中自定义了构造器,系统将不会在其中添加默认的构造器。

在子类中,可以通过super(参数列表)显示调用父类中的有参构造器,如下:

public class Student extends People{
    private int sno;
    public Student(){
        System.out.println("初始化Student的实例变量--无参构造器");
    }
    public Student(int sno){
        System.out.println("初始化Student的实例变量--有参构造器");
        this.sno = sno;
    }
    
    public Student(String name, int age, int sno){
        super(name, age);
        this.sno = sno;
    }
    public static void main(String[] args){
        Student s1 = new Student();
        Student s2 = new Student(1);
        Student s3 = new Student("huhu", 20, 2);
    }
}
class People{
    private String name;
    private int age;
    public People(){
        System.out.println("初始化People的实例变量--无参构造器");
    }
    public People(String name, int age){
        System.out.println("初始化People的实例变量--有参构造器");
        this.name = name;
        this.age = age;
    }
}


当Java new出一个子类对象时(是一个包含父类的子对象的子类对象,父类的子对象与单独new一个父类对象一样,只不过这个子对象位于子类对象内部),在执行子类构造器的步骤中,Java默认首先调用父类不带参数的构造器(若子类中没有使用super()调用父类的构造器),然后回来执行子类构造器。

 

 

 

 

 

转载于:https://my.oschina.net/tashi/blog/186961

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值