具有不同返回类型的多态性中的覆盖函数

时间:2014-11-19 14:27:23

标签: java

查看以下代码并帮助我理解为什么“mf.display”的返回类型是Object Type。虽然“mf”是“MyFather”类型,但仍然返回类型“mf.display()”必须是整数类型

class MyFather
{
    Object display()
    {
        System.out.println(1000);
        return 1000;
     }
}


class MySon extends MyFather
{
    @Override
    Integer display()
    {
        System.out.println(500);
        return 500;
    }
}


public class TestInheritance {

    public static void main(String[] args) {
        MyFather mf = new MySon();
        Integer myInt = mf.display();  // Error.Type mismatch cannot convert from Object to  
                                       //   Integer
    }
}

2 个答案:

答案 0 :(得分:0)

类型myFather声明方法Object display(),所以当你写

mf.display()

该表达式的类型为Object。您分配给mf的对象类型无关紧要。这是有道理的,因为mf也可能是方法参数:

static void useFather(myFather mf) {
   mf.display();
}

你可以用任何实例调用这样的方法,比如

useFather(new myFather());

不得允许代码假设它具有子类的实例。

答案 1 :(得分:0)

为了清楚讨论,我应该声明,mySon类(应该命名为MySon)覆盖myFather类的display()(再次应该命名为MyFather),因为根据Java规范,覆盖方法

The return type must be the same as, or a subtype of, the return type declared
in the original overridden method in the superclass

现在已说过让我们继续讨论,

访问对象的唯一方法是通过引用变量, 关于参考文献,还有一些要记住的关键事项。

  1. 引用变量的类型决定了可以调用的方法 变量引用的对象。( 这个对你来说很重要
  2. 引用变量只能是一种类型,一旦声明,就是该类型 永远不能改变(虽然它引用的对象可以改变)。
  3. 引用是一个变量,因此可以将其重新分配给其他对象,(除非 引用被宣布为final。。
  4. 引用变量可以引用与声明的类型相同的任何对象 引用,或 - 这是一个大的 - 它可以引用任何子类型 申报类型! ( 这是您通过撰写 myFather mf = new mySon();
  5. 所做的事情。
  6. 引用变量可以声明为类类型或接口类型。如果 变量被声明为接口类型,它可以引用任何对象 实现接口的类。
  7. 如果您想了解有关覆盖和重载的更多信息,我认为您应该参考一些关于此主题的标准Java书籍。

    干杯!