问题:
在测试类中创建一个多态 Base b2 = new Sub();
结果在父类的构造器方法中调用的method重写方法,调用的却是子类的,这是为什么?
看以下代码:
public class Test01 {
public static void main(String[] args) {
/*
1.new 的是父类对象,走父类构造
直接调用了父类的method
输出 base:100
*/
Base b1 = new Base();
/*
2.多态new对象 new了子类对象 执行子类无参时先走父类无参构造
此时父类中无参构造调用的method为重写后的method,然后传了一个100
所以先输出 sub:100
然后再执行super.method(70)调用父类method,并传递70
所以输出 base:70
*/
Base b2 = new Sub();
System.out.println(b2.getClass());
}
}
public class Sub extends Base{
Sub() {super.method(70);
}
public void method(int j) {
System.out.println("sub : " + j);
}
}
public class Base {
Base() {
method(100);
}
public void method(int i) {
System.out.println("base : " + i);
}
}
以上方法执行的顺序是:
1、base : 100
2、sub : 100
3、base : 70
4、class Sub
在父类的构造器中跳转的方法是子类的是因为,new的运行类型是Sub(),所以执行的方法就是Sub类中的方法。
多态运行的方法只和=左边的运行类型有关,也就是你new的谁就去调谁的方法
如果new的对象中没有,由于有继承关系就会去父类中寻找,这其实是属于多态的动态绑定机制
并且调用不了父类中的 private属性变量和方法
还可以借鉴一下别人的文章