java继承中执行构造方法的顺序

前提知识:

1.在牵扯到继承的类中,如果子类实例化的话,必须先将父类初始化,也就是调用父类的构造方法

2.创建类的时候,没有写构造方法的话,系统会默认帮我们写一个无参的构造方法(在代码里看不见),如果我们自己写了构造方法,那么系统就不会帮我们写这个无参的构造方法

3.补充1,如果类牵扯到继承的时候,如果没写构造方法,系统会默认帮我们写一个无参的构造方法,并且在子类无参构造方法里默认帮我们添加super(),即调用父类的无参构造方法

4.子类继承父类后,并不是执行完extends语句后直接跳到父类的构造方法,而是在遇见子类实例化的时候,通过调用子类的构造方法,然后再从子类的构造方法中的super跳到父类的构造方法

5.在子类的构造方法中,如果父类的构造方法是无参的,那么子类的构造方法里面的super();可以不写,但如果父类的构造方法是有参的,那么子类的构造方法里面必须写super(形参);

6.最基础但最容易忽视的就是,任何java代码,都是从main方法的第一句开始执行

题目分析

题1:

分析:

首先一切都是从main中的第一条语句开始,即new Alpha(),因为这个就是子类的实例化,所以会调用Alpha的构造方法,虽然没写,但是系统默认有一个无参的构造方法,再加上这个是类牵扯到继承,所以系统会默认又给这个Alpha无参的构造方法里面自动加super();

即实际上存在的代码有这些

所以顺序是new Alpha()——>Alpha()——>super()——>class Base——>Base()——>打印"Base"——>new Base()

——>Base()——>再打印"Base"

所以答案选择B:BaseBase

题2:

分析:首先一切都是从main里第一条语句开始,new Derived("C"),然后跳到public Derived(String s),因为类牵扯到继承,要先将父类初始化,所以必须要有super,但是我们写了Derived的有参构造方法,所以系统不会给我们写无参的构造方法,同时父类的构造方法public Base(String s)是有参的,有参是不能不写的,所以在public Derived(String s)里面必须得有super(形参),可是我们这里的代码没有super(形参),会编译错误

所以顺序是:new Derived("C")——>public class Derived extends Base——>public Derived(String s)——>找不到super(形参)——>编译错误

所以答案选D:编译错误

题3:

首先一切都是从main里第一条语句开始,new Z();是子类实例化,所以会先将父类初始化,因为父类X的构造方法public X()是无参的,所以子类构造方法public Z()里面可以不写super();系统会默认帮我们添加,然后跳到class X,父类X第一句又是将Y实例化,因为Y是单独的,不牵扯继承,所以不需要super,extends什么的,就是正常地跳到class Y,然后打印Y,然后回到class X,执行public X(),打印X,然后回到public Z(),打印Z,最后main运行完了,执行

Y y=new Y();打印Y

实际上的代码:

所以顺序为new Z()——>public Z()——>super()——>class X——>Y y=new Y()——>

class Y——>public Y()——>打印Y——>public X()——>打印X——>回到public Z(),然后打印Z——>main结束,来到Y y=new Y();——>class Y——>public Y()——>打印Y

最后会打印YXZY

所以答案选C:YXZY

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值