Java 转换为超类,并调用重写的方法

Java 转换为超类,并调用重写的方法,java,casting,polymorphism,Java,Casting,Polymorphism,我还有下一个问题。 我扩展了一个类,Parrent,并在Child类中重写了它的一个方法。我试图将类型强制转换为超类类型,但每次都会得到子类的重写方法。当我使用多态性时也会发生这种情况 问题在下面代码内的注释中。。。 提前谢谢 class Parrent{ public void test(){ System.out.println("parentTest"); } } class Child extends Parrent{ @Override

我还有下一个问题。 我扩展了一个类,
Parrent
,并在
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?

    }
}

实际类型是Child,因此当您调用方法时,将调用子方法。引用类型是否为父类型并不重要,重要的是对象的实际类型


您也不能为了调用父方法而“强制转换为超类”。

强制转换完全是为了编译器的利益。JVM对此一无所知,也不影响调用什么方法。JVM试图通过查找与给定签名匹配的内容来解析方法,从最特定的类开始,沿着层次结构向上一直到根(java.lang.Object),直到找到某个内容

多态性的目的是使调用某个对象的代码不必确切地知道正在使用的子类,被调用的对象负责自己的专用功能。让一个子类重写一个方法意味着该子类的对象需要以自己的特定方式处理该方法,而调用方不必关心它


强制转换适用于奇数边缘情况,在这种情况下,您的代码无法知道某些内容是什么类型。如果您知道超类型(在您的示例中是父类),则不需要强制转换,子类应该自行处理。

方法解析发生在运行时,而不是编译时。对象的类(其行为)声明了方法的一个实现,以便使用

能够通过超类引用对象是OOP的本质。

请参见此处调用child方法,因为函数在运行时是绑定的,并且在引用内存中是child


((Parrent)new Child()).test();//new Child()意味着内存是Child的

我被下一步弄糊涂了:如果我有一个指向子类对象的超类引用,我就得到了引用方法。这里我有超类的引用,它指向子类的对象,我得到子类的方法。@user3281263:你看到的是基于编译时类型的。