转换为超类和调用覆盖方法 [英] Casting to Superclass, and Calling Overriden Method

查看:112
本文介绍了转换为超类和调用覆盖方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我的下一个问题。
我已经扩展了一个类, Parrent 并覆盖其中的一个方法在 Child 类。我试图将类型转换为超类类型,但我每次都得到孩子的重写方法。这也发生在我使用多态性时。

I have my next question. I have extended a class, Parrent and overridden one of its method in the Child class. I tried to cast the type to the superclass type, but I get the child's overridden method every time. This also happens when I use polymorphism.

问题在下面的代码中的注释...
提前感谢。

Questions are in the comments inside code below... Thanks in advance.

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)向上移动,直到找到某个对象。

Casting is solely for the benefit of the compiler. The JVM doesn't know anything about it, and it does not affect what method gets called. The JVM tries to resolve a method by looking for something that matches the given signature, starting with the most specific class and working its way up the hierarchy towards the root (java.lang.Object) until it finds something.

多态的目的是使代码调用某些对象不必知道正在使用什么子类,被调用的对象负责其自己的专用功能。有一个子类重写一个方法意味着该子类的对象需要以自己特定的方式处理该方法,并且调用者不必关心它。

The purpose of polymorphism is so code calling some object doesn't have to know exactly what subclass is being used, the object being called takes care of its own specialized functionality. Having a subclass override a method means that objects of that subclass need to handle that method in their own particular way, and the caller doesn't have to care about it.

铸造是针对奇数边缘情况,其中你的代码不知道什么类型的东西。如果你知道超类型(你的例子中为Parent),你不应该强制转换,子类应该自己处理。

Casting is for odd edge cases where your code can't know what type something is. You shouldn't need to cast if you know the super type (Parent in your example), the subclass should take care of itself.

这篇关于转换为超类和调用覆盖方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆