Java 基础知识

前言

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


正文

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


首先,程序执行时,先执行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的副本,后面的改变是无效的。为了验证这点,写给简单程序进行验证:

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


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

相关文章:

  • 2021-08-06
  • 2021-11-02
  • 2022-12-23
  • 2021-10-14
  • 2021-10-03
  • 2021-08-17
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-23
  • 2021-12-04
  • 2021-07-24
  • 2022-12-23
  • 2022-02-06
  • 2021-08-14
  • 2021-09-02
相关资源
相似解决方案