覆盖Java中的方法

时间:2013-09-18 04:51:24

标签: java override method-overriding

public class A{
    public MyType myMethod(){...}
}

public class B extends A{
    @Override
    public MyType myMethod(){...}
}

是一个任意的类。为什么MyType必须是MyAdvancedType的父类型?如果我们允许MyAdvancedType可以是任意类型会发生什么?

2 个答案:

答案 0 :(得分:2)

我想你的意思是第二个例子中的MyAdvancedType

有一个简单的解释你有以下LOC:

A a = new B();

现在,当您尝试在对象a上调用myMethod时,实际上,您将在B类方法中调用override。

现在,overriden方法返回MyAnvancedType的对象,但是您在类A上调用了该方法,这意味着您可以获得MyType的对象。因此,JVM会将MyAnvancedType转换为MyType,您将使用MyType对象,即使不怀疑您正在使用MyAdvancedType

回答你的第二个问题。即使编译器允许您使用任意类型,也会得到ClassCastException,因为编译器会尝试将MySomeOtherType强制转换为MyType

答案 1 :(得分:1)

如果我理解你:

为什么MyType必须是MyAdvancedType的父类型?

因为你自己写MyAdvancedType作为MyType的孩子(class B是你样本中class A的孩子),而java意识形态只允许一个父母。

如果我们允许MyAdvancedType可以是任意类型会发生什么

Java将您的MyAdvancedType识别为下一个类型:ObjectMyTypeMyAdvancedType。 例如,在这种情况下:

class A{
    void someMethod(){
        System.out.println("Class A method");
    }
}
class B extends A{}
...
A var = new B();
var.someMethod();

执行了A类的方法。但是在这种情况下:

class B extends A{
    @Overide //This string is optionally but good practice.
    void someMethod(){
        System.out.println("Class B method");
    }
}
...
A var = new B();
var.someMethod();

执行了类B的重写方法。此行为称为polymorphism