Java继承中构造函数的调用

踩坑日常

代码

public class Test1123 {
    public static void main(String[] args) {
        new A1();
        new B();
    }
}
class A1{
    int i=7;
    public A1(){
        setI(20);
        System.out.println("i from A is"+i);
    }
    public void setI(int i){
        this.i=2*i;
    }
}
class B extends A1{
    public B(){
        System.out.println("i from B is"+i);
    }
    public void setI(int i){
        this.i=i*3;
    }
}

输出

在这里插入图片描述

解释

子类中的方法都是继承自父类,当一个子类的对象被实例化的时候,new
A1();先会访问到声明类的构造函数,即class A1{},A1是默认继承自Object类的,所以要访问Object类的无参构造函数,而Object类中的无参构造函数为空,所以不进行操作,返回到子类A1中,接下来执行setI(20),
因为A1类中有setI方法,所以20 * 2=40,这个对象A1中的i就是40。并在System.out.println(“i from A is”+i)中输出。在返回到主函数中,执行new B(),先回找到B类的构造函数,发现B是继承自A1类的,所以在执行System.out.println(“i from B is”+i)之前会先访问A1类的构造函数,而A1又是默认继承自Object类,访问Object类,并没有什么操作,返回到A1类中,执行setI(20),又因为在B类中setI被重写,所以执行的setI是子类中的setI方法,20*3=60,并在接下来的输出中,输出的是i from A is60,因为现在还在父类的构造方法中,输出后就会返回到B的构造方法中,执行System.out.println(“i from B is”+i),这个就是B这个对象实例中的i,已经在刚才被计算成60了,所以输出i from B is60。

总结

1.当调用子类的构造方法是会首先调用他的父类的无参构造方法,这是在默认情况下,要是在子类的构造函数第一行就指明了子类调用的是哪个父类构造方法,JVM就会调用指定的构造方法,若是没有指定,JVM就会默认调用父类的无参构造方法。若是父类没有无参构造方法就会编辑错误,因此最好在编写代的时候给一个类加上无参构造方法。
2.父类中调用的一些方法,若是在子类中被重写,那么就会调用子类重写的方法。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值