关于Java父类构造函数和子类构造函数问题

说来惭愧,很久以前就总结过,但是当时不知道咋写博客,就没有在这里记录。然后,我以前总结的东西也不知道哪里去了,有点尴尬哈!
总之先进入正题:

//父类
class Person {
    public String name;
    public int age;

    //父类无参构造函数
    Person() {
        //其实父类无参构造函数里也隐式调用了super();只不过调用的是父类Object里的无参构造函数
        System.out.println("父类无参数构造函数---------person");
    }

    //父类有参构造函数
    Person(String name) {
        this.name = name;
        System.out.println("父类有参数构造函数 ---------person  :" + name);
    }
}

//子类
class Student extends Person {
    //子类无参构造函数
    Student() {
        //系统会在第一行隐式调用super();  故super();可写可不写
        System.out.println("子类无参数构造函数---------student");
    }

    //子类有参构造函数
    Student(String name) {
        //必须手动调用super(name);
        super(name);
        System.out.println("子类有参数构造函数---------student  :" + name);
    }
}


//一个java文件中只能存在一个public权限的类,且该类的类名必须和java文件名一致
public class Test {
    public static void main(String[] args) {
        Student s = new Student();
        Student s1 = new Student("zhangsan");
    }
}

运行结果
在这里插入图片描述
如果我们把子类有参构造函数里的super(name);注释掉:
在这里插入图片描述
再来看看运行结果:
在这里插入图片描述
有没有发现两次的运行结果不一样呢?

如果继续在子类有参构造函数中加入this();如图
在这里插入图片描述
一起看看运行结果:
在这里插入图片描述

有没有发现运行结果又不一样了呢?

好,我们再再上面的基础上修改子类无参构造函数
在这里插入图片描述咱再来看看运行结果:
在这里插入图片描述
哈哈,好像有不一样了呢!

总结:
对于子类构造函数,如果没有手动super调用父类构造函数时,系统会默认在子类构造函数里优先调用父类无参的构造函数,然后再执行子类构造函数里的代码;如果手动super调用父类构造函数了,则不再调用系统默认的无参父类构造函数。

this();在这里,其实就是调用子类无参构造函数。如果在子类有参的构造函数中,你不想手动写super();,你也 可以通过写this();调用子类无参构造函数,然后子类无参构造函数又自动调用父类无参构造函数(不管是手动写的super(),还是系统调用的父类无参构造函数)

对于子类有参的构造函数,你想给成员变量赋值的话,就必须手动写super(name);

发布了20 篇原创文章 · 获赞 2 · 访问量 3826

猜你喜欢

转载自blog.csdn.net/qq_43554951/article/details/105033923