java - 转换为父类(super class),并调用重写方法

标签 java casting polymorphism

我有下一个问题。 我扩展了一个类 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/

相关文章:

java - 在javafx中基于 ListView 中的选定项调用类

java - Transformer Java XML CDATA 重复行

java - 将 2d int 数组转换为 2d double 的最短方法

C# 多态属性

java - 在Applet中使用Files.walkFileTree

java - Jackson 映射到 POJO 无法反序列化实例实例

c++ - 当基类从非多态变为多态时,派生类上的 static_cast

c++ - 枚举整数类型转换 : operator or function

c# - 访问父类(super class)成员

c++ - 具有默认模板参数的多态类的模板推导失败