输出结果:22、34、17
1、执行 new B()
new对象B时,执行B构造函数
2、B类构造函数,先执行super(5)
super(5) 调用父类A构造函数
3、 A类构造函数执行setValue(5)
A类中有setValue方法,B类也有setValue方法。因为在执行B类构造函数,所以默认先调用B类中方法,B类没有在调用A类。所以调用B类setValue(int value)方法
4、执行super.setValue(10)
调用父类setValue(int value)方法,执行完,A类value =10,此时super(5)执行完毕
5、执行B类构造函数setValue(getValue() - 3 )
6、执行getValue(),因为B类没有getValue()方法,所以执行A类getValue()方法
7、执行A类getValue()方法
(1)value++; //value++变成11
(2)return value; //返回11保存在栈中
(3)因为没有异常,所以不用执行catch,最后执行finally
7、 finally里this.setValue(value),因为正在执行B类构造函数,所以this指的是B类,执行B类的setValue()方法
8、执行A类setValue(22)方法,执行完,A类value变成22
9、执行finally System.out.println(value);
输出22
10、执行B类构造函数setValue(getValue() - 3 ); 因为执行getValue()返回11,所以执行 setValue(8)
11、调用B类setValue(8)
12、调用A类setValue(16),执行完A类value为16,此时B类构造函数执行完毕
13、执行main函数new B().getValue()
14、调用A类getValue()方法
(1)value++; 执行完++,value = 17
(2)return value; 返回17保存在栈中
(3)执行finally块this.setValue(value),第一次调用B类setValue(17),调用父类setValue(34),此时A类value为34
(4)执行finally块ystem.out.println(value),输出结果为34
15、执行System.out.println(new B().getValue());
输出结果为17