以前一直以为子类转父类后,就会调用父类的方法了。其实不是,依旧是子类的方法。
class Child extends Parent{public void show() {System.out.println("I am child");} }
class Parent {public void show() {System.out.println("I am parent");} }
public class HelloWorld {
public static void main(String[] args) {
Child c = new Child();
Parent p = c;
p.show();
}
}
上面这个程序,创建一个Child实例,然后转成父类型,调用show(),会发现调用的还是子类行的show()。
打印输出:
I am child
不仅如此,如果子类调用了继承的父类函数,而这个父类函数里又调用了一个同名函数,那么调用的仍旧是子类所重写的函数。
class Child extends Parent{ public void foo() {System.out.println("foo, I am child");} } class Parent {
public void show() {System.out.println("I am child");}
public void foo() {System.out.println("foo, I am Parent");} }public class HelloWorld {public static void main(String[] args) {Child c = new Child();Parent p = c;p.show();} }
这个例子增加了一个foo方法被show()间接调用,同时删除了子类的show()来强制调用父类的show(),结果证明,父类show仍旧调用子类的foo().
I am parent
foo, I am child
看来只要对象是子类,那它所调用(以及间接调用)的方法都会优先选择属于它的同名子类方法,无视类型转换。