Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有不同返回类型的多态性中的重写函数_Java - Fatal编程技术网

Java 具有不同返回类型的多态性中的重写函数

Java 具有不同返回类型的多态性中的重写函数,java,Java,看一下下面的代码,帮助我理解为什么mf.display的返回类型是Object type。虽然mf是MyFather类型,但mf.display的返回类型必须是整数类型 class MyFather { Object display() { System.out.println(1000); return 1000; } } class MySon extends MyFather { @Override Intege

看一下下面的代码,帮助我理解为什么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
    }
}
myFather类型声明了一个方法对象显示,因此当您编写

mf.display()
该表达式的类型为Object。指定给mf的对象类型并不重要。这是有意义的,因为mf也可能是一个方法参数:

static void useFather(myFather mf) {
   mf.display();
}
您可以对任何实例调用这样的方法,例如

useFather(new myFather());

不允许代码假定它有子类的实例。

为了讨论的清楚,我应该声明,应该命名为mySon的mySon类重写了myFather类的显示,应该再次命名为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
现在我们继续讨论

访问对象的唯一方法是通过引用变量, 关于参考资料,有一些关键的事情需要记住

引用变量的类型决定了可以在上调用的方法 变量所引用的对象。这对您理解很重要 引用变量只能是一种类型,一旦声明,该类型即为该类型 即使它引用的对象可以更改,也不能更改。 引用是一个变量,因此可以将其重新分配给其他对象,除非 引用被声明为最终引用。 引用变量可以引用与声明变量类型相同的任何对象 引用,或者这是一个大的引用,它可以引用 声明类型!这就是你通过写myFather mf=new mySon所做的事情; 引用变量可以声明为类类型或接口类型。如果 变量被声明为接口类型,它可以引用任何类型的任何对象 实现接口的类。 我认为,如果您想了解有关重写和重载的更多信息,您应该参考一些关于这个主题的标准Java书籍


干杯

因为您的变量mf是myFather,返回类型不被覆盖。请遵守Java命名约定-它们不是可选的。类是用CamelCase编写的,从一个大写字母开始,您会注意到代码看起来也更好,因为SO语法检测突出显示了名称:-通常称为PascalCase,而不是CamelCase@SBI实际上这是我第一次听到这个名字,通常我们用大写和小写,但我确实喜欢它:谢谢Marko。我得到了它。