Java学习-在继承中访问构造方法的解析

这篇博客探讨了Java中构造方法的基础知识,强调在继承场景下如何访问父类构造方法。当子类继承父类时,如果父类有无参构造方法,编译器会自动在子类构造方法中添加`super()`调用。如果父类只有有参构造方法,子类构造方法必须显式使用`super()`调用来确保父类实例化。同时,`this()`可用于在子类构造方法内部调用本类的其他构造方法,但`this`和`super`必须位于构造方法的第一行,且不能同时使用。
摘要由CSDN通过智能技术生成
  1. 构造方法的基础概念:
    a. 构造方法在创建实例对象的时候调用
    b. 如果一个类没有写构造方法,那么编译器会自动送一个默认的无参构造器给你
    c. 只要你定义了一个构造方法,不论有参数没参数,编译器都不会再送你
  2. 对子类来说,如果没有写构造方法,那么编译器自动赠送一个,但是前提是父类存在无参构造方法(不论是父类中自己定义的还是编译器赠送的那个, 只要有就行)
  3. 如果父类中有无参构造方法,在子类中要定义一个构造方法的时候,编译器会自动赠送一个super()来访问父类的构造方法
父类:
public class inherit_test2 {
    public inherit_test2(){
        System.out.println("2 的构造方法");
    }
}
子类:
public class inherit_test3 extends inherit_test2{
    public inherit_test3() {
        // super();  // 这个super写不写都行,不写的话编译器也会送你一个
        System.out.println("3 的构造方法");
    }
main执行:
public class inherit_test {
    public static void main(String[] args) {
        inherit_test3 zi = new inherit_test3();
    }
}
执行后输出:
2 的构造方法
3 的构造方法

从上面的输出可以看到,明明只是实例化inherit_test3的对象,但是inherit_test2的构造方法也调用了。因为编译器自动给子类的构造方法加上了个super()来调用父类的构造方法
4. 如果父类中只定义了有参构造方法,没有无参构造方法,如下

public class inherit_test2 {
    String a = "fua";
    String b = "fub";
    int c;
    public inherit_test2(int num){
        this.c = num;
        System.out.println("2 的有参构造方法");
    }
}

那么在子类中就必须定义一个构造方法,看如下的做法会报错,原因是父类中只有一个有参构造方法,没有默认的构造方法,所以在子类定义的构造方法必须用super()来访问父类构造方法,因为:必须确保构造子类对象的时候能够构造出父类, super()的作用就把父类中的构造方法拿过来构造父类,要是父类都创建不出来就不存在子类一说了

public class inherit_test3 extends inherit_test2{
    String a = "zia";
    String b = "zib";

    public inherit_test3() {  // 这里会报错,提示父类中没有无参构造方法
        System.out.println("3 的构造方法");
    }
}

用super来访问有参构造方法,需要注意的是:super必须在子类构造方法的第一行, 如下

public class inherit_test3 extends inherit_test2{
    String a = "zia";
    String b = "zib";

    public inherit_test3() {
        super(20);	// 用super访问有参构造方法, 构造父类的时候需要传一个int,这里传了20,也就是传给了父类成员变量c
        System.out.println("3 的构造方法");
    }
}
  1. 在上面两个基础上再考虑子类的构造方法
    这里给子类定义了俩构造方法,一个无参,一个俩参,但相同的点是:必须都有super()去访问父类的构造方法,换句话说,我能够确保能把父类构造出来,在这个基础上,那我子类的构造方法就又可以随便发挥了
public class inherit_test3 extends inherit_test2{
    String a = "zia";
    String b = "zib";
    int d;
    int e;

    public inherit_test3() {
        super(20);
        System.out.println("3 的构造方法1");
    }
    public inherit_test3(int num, int num2, int num3) {
        super(num);
        this.d = num2;
        this.e = num3;
        System.out.println("3 的构造方法2");
    }
}
  1. 访问本类中的另一个构造方法
父类:
public class inherit_test2 {
    String a = "fua";
    String b = "fub";
    int c;
    public inherit_test2(int num){
        this.c = num;
        System.out.println("2 的有参构造方法");
    }
}
子类:
public class inherit_test3 extends inherit_test2{
    String a = "zia";
    String b = "zib";
    int d;
    int e;

    public inherit_test3() {
        super(20);
        System.out.println("3 的构造方法1");
    }
    public inherit_test3(int num) {
        this();
        this.d = num;
        System.out.println("3 的构造方法3");
    }
}
main:
public static void main(String[] args) {
        inherit_test3 zi = new inherit_test3(2);
}

在main中采用第三种构造方法,构造方法3中有this()首先调用本身类中的无参构造方法public inherit_test3(), 在这个方法里又先调用super(20)。所以这时候整体的打印运行顺序是:
a. System.out.println(“2 的有参构造方法”);
b. System.out.println(“3 的构造方法1”);
c. System.out.println(“3 的构造方法3”);

注意点: this 和super用在构造方法里的时候必须在第一行,所以这两者不能同时使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值