我有下一个问题。
我扩展了一个类 Parrent
并重写了 Child
类中的一个方法。我尝试将类型转换为父类(super class)类型,但每次我都会得到 child 的重写方法。当我使用多态性时也会发生这种情况。
问题在下面代码内的注释中...... 提前致谢。
class Parrent{
public void test(){
System.out.println("parentTest");
}
}
class Child extends Parrent{
@Override
public void test(){
System.out.println("childTest");
}
}
class StartProgram{
public static void main(String[] args) {
Parrent p1 = new Parrent();
p1.test(); // output: parentTest
Child c1 = new Child();
c1.test(); // output: childTest
Parrent p2 = new Child();
p2.test(); // why returns child method? becouse it's overriden?
((Parrent) new Child()).test(); // why returns child method if I cast it?
}
}
最佳答案
强制转换只是为了编译器的利益。 JVM对此一无所知,也不会影响调用什么方法。 JVM 尝试通过查找与给定签名匹配的内容来解析方法,从最具体的类开始,沿着层次结构向上到达根 (java.lang.Object),直到找到某些内容。
多态性的目的是,调用某个对象的代码不必确切知道正在使用哪个子类,被调用的对象负责其自己的专门功能。让子类重写方法意味着该子类的对象需要以自己的特定方式处理该方法,并且调用者不必关心它。
强制转换适用于奇怪的边缘情况,在这种情况下,您的代码无法知道某些内容是什么类型。如果您知道父类(super class)型(示例中的父类型),则不需要进行强制转换,子类应该照顾好自己。
关于java - 转换为父类(super class),并调用重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21613540/