Java的继承时父类与子类的构造方法的调用次序问题
可以先思考一下,该会输出什么?
正确输出答案:
People(String name)
Child(String name)
解析:1.带参数生成的对象固然要去找带有对应参数的构造方法,在Child类中进入了带有String参数的构造方法,由于有super(name)的语句存在;2.因此去找父类中带有String参数的构造方法,输出People(String name);3回到子类中执行输出Child(String name)。
2.注释了super(name)的情况
正确输出结果:
People()
Child(String name)
解析:1.带参数生成的对象固然要去找带有对应参数的构造方法,在Child类中进入了带有String参数的构造方法,由于没有super带参数的方法,但是会默认有super()的方法的存在;2.因此就会去找父类的无参的构造方法输出People();3.返回到子类中输出Child(String name)。
总结:
子类的构造过程中一定会调用父类的构造方法,如果没有使用super方法带参的声明(该带参方法必须在构造方法的第一行,否则会报错),被调用的任意一个的子类构造方法都会默认执行super()方法,调用父类的无参构造方法;如果使用了super的带参声明,则会执行相对应的父类中的构造方法,而父类中的无参构造不在会被调用。
下面来个思考题的拓展一下:
正确输出结果:
child_playFootball:null
child_playBasketball:null
child_playFootball:jerry
child_playBasketball:jerry
解析:1.对象的生成去找Child()无参构造;2.由于继承关系默认去找父类的无参构造方法;3.然后加载父类中私有变量name;4.又进入People的构造方法,找到了playBasketball()方法;5.此时又回到子类中寻找是否有此类方法,找到了该同名方法,输出时由于Child类中未加载本类中的私有变量name,所以输出只能时null;6.和步骤5一样;7.处理完了父类,回到Child类中,加载了本类中的私有变量,正常输出。
如果将上面的两类中的方法中的public改为private ,正确输出
people_playFootball:tom
people_playBasketball:tom
child_playFootball:jerry
child_playBasketball:jerry
论private的重要性,要养成良好的代码习惯很重要,要时常保持本类中分变量或者方法处于private状态。