Java对象实例化过程中的多态引用问题
一,多态引用问题(按照注释序号1,2,3…进行阅读)
package com.hzc.questions;
/**
* @author flowerWorm
* @createTime 2021年11月27日 01:21:00
* 多态引用问题2
* 执行对象实例化过程中遵循多态特性,调用的方法都是实例化子类中的重写方法,只有明确调用了super.xxx关键词或者说子类中没有该方法时,才会去调用父类的该方法
*/
public class Base2 {
public static void main(String[] args) {
System.out.println(new B().getValue());//1,进入main方法 //17,new B().getValue()方法执行,由于子类并没有getValue方法,则直接调用父类的该方法即可 //25,new B().getValue()返回17,输出
}
static class A {
protected int value;
public A(int v){
setValue(v);//3,调用子类的setValue(5)方法,传入一个5,返回一个10
}
public void setValue(int value) {
this.value = value;//5,this.value=10 //11,this.value=22 //16,this.value=16 //22,this.value=34
}
public int getValue() {
try {
value++;//7,子类中并没有getValue()方法,所以这里直接调用父类的getValue()方法,此时的value=10,value++=11 //18,此时value=16,value++=17
return value;//8,return 11,不过得在finally代码块执行结束后才回返回11 //13,将之前保存的return 11给return回去 //19,return 17,不过得在finally代码块执行结束后才回返回11 //24,将之前保存的return 17给return了
}finally {
this.setValue(value);//9,有finally先执行finally中的代码块,再返回try中的return去,此时的value=11,这里用this调用子类重写过的setValue(11)方法 //20,调用子类的setValue(17)方法
System.out.println(value);//12,输出value,此时value=22 //23,输出value,此时value=34
}
}
}
static class B extends A {
public B() {
super(5);//2,调用父类的含参构造函数
setValue(getValue() - 3);//6,调用getValue()方法,可以看到子类中并没有该方法,则调用父类的该方法 //14,getValue()方法执行完毕,返回1,则调用子类的setValue(11-3)方法
}
public void setValue(int value){
super.setValue(2 * value);//4,调用super,setValue(2 * 5)方法 //10,再次进入该方法,传进来的形参value=11,则调用父类的setValue(2*11) //15,再次进入该方法,此时的形参value=8,所以此刻调用父类的setValue(2*8)方法 //21,调用super(2*17)
}
}
}
运行结果 : 22 34 17