一个关于java调用顺序的题目
2017-04-24 15:19
211 查看
在牛客网上刷到了一道很有意思的java题
![](https://img-blog.csdn.net/20170424152011046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcDc0NDE3NDUyOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170424152031984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcDc0NDE3NDUyOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这道题还是有一些绕的,但是如果对java的调用顺序十分了解的话,做对这道题也很容易。
首先程序执行了new B(),new B里上来super(5),我们就要去找到B的父类A中的构造方法,A中的构造方法执行了一步setValue(),这里是第一个重点,就是这个setValue执行的是A的setValue还是B的setValue。
这里因为我们执行的是new B,所以我们首先要去找的是B中的setValue方法,如果B中没有setValue(),程序才会去实现父类A的setValue方法。
所以这个时候v的值实际上是10.。到了这一步super(5)就执行完了。
接着向下执行setValue(getValue()-3)。
B中并没有getValue(),所以去找他的父类A的getValue方法。value++,value的值变成11,再执行finally部分,this.setValue显然又是调用了B的setValue方法,所以这个时候输出的是22。但是这个时候要注意,返回的value值依然是11。因为try 中的return已经返回了value。
接下来按照这个思路,就可以很轻松的分析出程序的执行结果了
这道题还是有一些绕的,但是如果对java的调用顺序十分了解的话,做对这道题也很容易。
首先程序执行了new B(),new B里上来super(5),我们就要去找到B的父类A中的构造方法,A中的构造方法执行了一步setValue(),这里是第一个重点,就是这个setValue执行的是A的setValue还是B的setValue。
这里因为我们执行的是new B,所以我们首先要去找的是B中的setValue方法,如果B中没有setValue(),程序才会去实现父类A的setValue方法。
所以这个时候v的值实际上是10.。到了这一步super(5)就执行完了。
接着向下执行setValue(getValue()-3)。
B中并没有getValue(),所以去找他的父类A的getValue方法。value++,value的值变成11,再执行finally部分,this.setValue显然又是调用了B的setValue方法,所以这个时候输出的是22。但是这个时候要注意,返回的value值依然是11。因为try 中的return已经返回了value。
接下来按照这个思路,就可以很轻松的分析出程序的执行结果了
相关文章推荐
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的研究
- 关于java的多态方法调用顺序的问题
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的探讨 .
- java关于继承中构造函数的调用顺序
- 关于java 调用一个solr服务的两个collection
- 一个关于继承关系中静态快、成员变量、构造体代码的执行顺序的Java代码
- python一个关于比赛顺序的题目
- 一个关于java继承的题目
- 关于java初始化顺序的一个示例
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的探讨
- 一个题目深入理解 java继承中构造方法的执行顺序
- 关于java调用window DLL里的函数的总结
- 一个关于C#调用API的网站
- DEMO[C#]关于类构造函数的调用顺序的一点补充[针对书C#入门经典所举范例的不足]
- java中关于static的一个小问题
- 关于Java的RMI编程的一个简单的例子
- 今天发现一个Java的关于java.io.File在处理com1到com9为文件名的Bug.
- 关于动态生成WML文件的一个Java实例(3)
- 关于一个CCIE考试题目的研究(重分发)