为了账号安全,请及时绑定邮箱和手机立即绑定

关于构造方法调用的问题

关于构造方法调用的问题

临摹微笑 2019-03-21 13:15:39
现在这样一个问题,不明白想请会的讲解下,问题如下:现有三个类: 一个Father类,一个Son类,继承Father类,一个测试类Test,代码如下:public class Father {  public int value=100;             // 这里为1 public Father(){                  // 这里为2  int i=20;                // 这里为3  System.out.println(i);   // 这里为4 }}public class Son extends Father { public int id=200;                  // 这里为5 public Son(){                       // 这里为6  int j=10;           // 这里为7  System.out.println(j);     // 这里为8 }}public class Test{    public static void main(String[] args){        Father f=new Son();                   // 这里为9    }}现在我在Test中的主方法main那里设置断点:用debug as 调试,只按F5,我想问下为什么执行顺序会是:9→6→2→1→3→4→5→7→8→9请各位大神级人物讲解下,尤其为什么有1与5这两个步骤,还有从9到6再到2,好像没有进入构造方法内部,这样子调用起什么作用,或者有什么含义?
查看完整描述

4 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

这是因为继承。继承的话一定是先初始化父辈的属性和方法,这样暴露给后辈的方法或属性才能被使用。
9到6不用说了吧。说到6以后,由于son是继承了father的,所以会到2,这里其实是进入了son的构造方法。你可以在son的构造方法第一行写super()看会不会执行这一句。当然,如果你不直接写的话编译器会为你指定一个无参的父类构造方法,在这里是2。到达2后,依次初始化其中的属性,初始化后调用father这个构造方法(构造方法可以看成是一个特殊的方法,在别人调用这个方法时,会先把类中的属性进行一次初始化),就会看到执行1后接着执行3和4

查看完整回答
反对 回复 2019-04-26
?
烙印99

TA贡献1829条经验 获得超13个赞

对于java继承的初始化,原则是:先父类,后子类;在同一个类里是先变量与代码块,后构造函数


查看完整回答
反对 回复 2019-04-26
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

在执行子类的构造方法时,默认会先执行super()这个方法,是指父类的构造方法,所以这时会去初始化父类,父类初始化完了后,才执行子类构造方法的后面的代码


查看完整回答
反对 回复 2019-04-26
?
动漫人物

TA贡献1815条经验 获得超10个赞

当我们首次主动使用类的时候会导致类的初始化。然而类的初始化顺序如下:
1. 首先初始化该类的静态的成员变量或或者静态方法,静态代码块,这些静态的东西按照出现在类中的顺序初始化。
2. 初始化完静态的成员变量和静态代码块后就要初始化非静态的,同样的,非静态的成员变量,非静态的代码块也按照出现的顺序初始化。
3. 上面的两个步骤走完之后就初始化构造方法。

但是,一个子类的初始化必将导致父类的初始化。意思就是说,子类初始化之前需要先初始化父类,因为可能我们需要在子类中引用父类中的数据。

希望这样的讲解,能够帮到你。


查看完整回答
反对 回复 2019-04-26
  • 4 回答
  • 0 关注
  • 488 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信