Java 中继承关系和try-finally有返回值时的执行顺序

版权声明:欢迎转载评论~哈哈哈哈请标明出处呀 https://blog.csdn.net/legendaryhaha/article/details/88408297

Java 基础知识

前言

基础打不牢,地动山摇。刷题时发现之前做过的一道题,结果又做错了。在ide打断点调试许久,在这里记一下。


正文

如下:
在这里插入图片描述
答案:
在这里插入图片描述


首先,程序执行时,先执行new B(),又因为B继承于A,所以根据B中的super(5),先调用A中的构造方法,而在A中又需要调用setValue(int value)方法。

根据多态的概念,子类重写父类的方法后,父类的方法会被覆盖。所以,A调用的是子类B的setValue(5)方法,但是蛋疼的子类B有用super关键字调用了父类的setValue(int value)方法,还把原来的参数乘以2,即10。到这里,B中构造方法的super(5)算是执行完了。

接下来是setValue(getValue()-3),由于子类未重写getValue()方法,所以会调用父类的getValue()方法。所以,value++ 变成了11,因为try中又return,但又有finally,此时,会将value先保存起来,接着执行finally中的方法,这句this.setValue(v alue ) 就坑到我了,我以为是调用父类的setValue方法,其实不然,this指当前对象,此时,我们还在执行B中的构造方法,当前对象应该是B,所以调用B中的setValue方法。

到这里,我应该就明白了,调用B中的setValue方法后,value变成22,然后打印出来。接着才返回,可能有人奇怪,此时的value已经被改变了,不应该返回22吗。其实不是的,上面也说了,在返回时(还未真的返回),就已经先保存了value的副本,后面的改变是无效的。为了验证这点,写给简单程序进行验证:

在这里插入图片描述
在这里插入图片描述


明白了这一点后,后面就好做了。虽然打印是22,但返回是11,然后减去3后变8。接着经过子类的setValue方法后,传递到父类时,又变成16,到这里就告一段落了,main函数的new B()就完成了。下一步,调用getValue(),同理,在finally中打印出34,但返回的是17,最后打印出来就是17。


更新:在try-finally语句中,如果是静态变量的话,那么finally对静态变量的改变则会影响到返回值。
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/legendaryhaha/article/details/88408297