继承中的构造方法原理(通俗易懂)

public class Fu {
    public Fu(){
        System.out.println("这是父类的无参数构造方法");
    }
   
}
public class Zi extends Fu{
    public Zi(){
        System.out.println("这是子类的无参数构造方法");
    }
public class Demo {
    public static void main(String[] args) {
        Zi a=new Zi();
        System.out.println(a);
    }
}

继承中的构造方法原理(通俗易懂)_第1张图片

为什么会输出父类的构造方法呢?

过程如下:构造方法的作用是给对象初始化一个值,所以在main函数中执行打印a的语句是可以执行的,默认执行子类里的无参数构造方法,如果子类有父类(即有继承关系),子类的构造方法里的第一条一句会默认为super()

public class Zi extends Fu{
    public Zi(){
        super();
        System.out.println("这是子类的无参数构造方法");
    }

super是访问父类构造方法的关键字

注意:默认的这个super()这个括号是不带任何东西的,即访问的是父类的无参数构造函数

一般来说:如果一个类他不创建构造方法他是默认有一个无参数构造方法的。除非你自己创建一个有参数的构造方法,这个时候他就不给你默认了,如果想要无参数构造方法得自己去创建

思考:如果父类中我们只有含参数构造方法怎么办,会出现什么情况呢?

他会报错,因为默认super()这个语句他在父类中找不到无参数构造方法,那他怎么执行呢,你总得告诉他走哪条路

所以我们就像如图所示把super这个语句自己写出来,再传个参数过去,这不就满足有参数构造方法的访问嘛

public class Fu {
    public Fu(int age){
        System.out.println("这是父类的无参数构造方法");
    }
   public Fu(){}
}
public class Zi extends Fu{
    public Zi(){
        super(12);
        System.out.println("这是子类的无参数构造方法");
    }
    
}
public class Demo {
    public static void main(String[] args) {
        Zi a=new Zi();
        System.out.println(a);
    }
}

这种情况,子类中super访问的是有参数的构造方法,但父类中也有无参数构造方法,这输出的是啥呢

继承中的构造方法原理(通俗易懂)_第2张图片

总而言之如果super你自己写了,他就不给你默认了,就按照你的走;如果没写就按照默认的访问父类的无参数构造方法

构造方法他实现的过程解析在我的主页有讲,大家可以看看,我自己的一些理解,有不足大家请指出

你可能感兴趣的:(java,开发语言)