在写完第一篇还没有一会儿,我就开始写这第二篇了, 因为这片的内容与第一篇的内容有着一定的相似性,都是在向上转型以后回头调用子类的成员。还是直接上代码
package test;
import edu.princeton.cs.algs4.StdOut;
class A{
public static void f1(A a){
a.f2();
}
public void f2(){
StdOut.println("This is A.f2");
}
}
class B extends A{
public void f2(){
StdOut.println("This is B.f2");
}
}
public class test_1 {
public static void main(String[] args){
B b = new B();
A.f1(b);
}
}
以下是输出:`
This is B.f2
我的理解:
大家可以发现在第一篇里面通过向上转型后的子类对象通过父类方法无法操作子类的成员变量。这是上一篇的结果,因为才一会儿我还没有找到具体的解决办法。但是这个通过子类的向上转型,然后先调用父类方法f1(),f1()中调用子类重载的方法f2()。最终结果是成功的,正常的调用了重写的方法。说明在操作域上与数据域有着一定的差别。具体原理我也还没有搞的特别的清楚,希望后面能够继续深入这个问题。将多态与继承弄明白。