当前位置: 首页 > 面试题库 >

为什么我们不能重写方法并定义它以返回原始方法的超类?

牛骞仕
2023-03-14
问题内容

我目前正在从Java教程oracle学习Java类和对象,并且遇到了以下语句和代码。我理解这个概念,但是不知道为什么我们不能覆盖一个方法并定义它以返回原始方法的超类?背后的原因是什么?有人可以启发我吗?在此先感谢您的帮助!

您可以重写方法并定义它以返回原始方法的子类,如下所示:

public Number returnANumber() {
    ...
}

覆盖原始方法:

public ImaginaryNumber returnANumber() {
    ...
}

问题答案:

想象一下是否有可能:

public class CarFactory {
    Car giveMeACar() { ... };
}

public class SpecialCarFactory extends CarFactory {
    @Override
    Object giveMeACar() {
        return "hello world";
    }
)

public class Driver {
    void drive() {
        CarFactory carFactory = new SpecialCarFactory();

        Car car = carFactory.giveMeACar();
        // err, wait, sorry, can't do that. 
        // This car factory, despite its name, doesn't produce cars. 
        // It produces objects, and I've heard they're just 
        // "hello world" strings. Good luck driving a "hello world"
        // string on a highway!
    }
}

瞧,这只是合同问题。当您去咖啡店时,您期望它可以出售咖啡。如果不遵守此合同,则不能将其称为“咖啡店”:咖啡店必须出售咖啡。它可以出售牛奶咖啡,因为牛奶咖啡仍然是咖啡。(就像汽车制造厂只能生产丰田汽车一样,因为丰田汽车是一辆汽车,您可以像其他任何一辆汽车一样驾驶丰田汽车,
甚至不知道它是丰田汽车 :这就是多态性。)



 类似资料:
  • 我不明白这一点: 没有这个,我可以做到: 为什么在第一种情况下我不能调用hello()方法,而在第二种情况下我可以调用?

  • 问题内容: 在哪里返回。这不会编译…我 几乎 可以理解为什么。但是,如果我想从一个空白中返回一个空白,为什么不呢?相反,我最终写了这样的东西: 我不是在寻找代码样式建议,我想知道为什么Java明确禁止这种类型的void返回。任何信息表示赞赏,谢谢。 问题答案: 带有表达式的return语句返回该表达式的值。的类型的是空隙表达-它不 具有 一个值。 从逻辑上讲,您想执行,然后返回-所以您必须说。这两

  • 编译器在第3行给出了一个错误 此实例方法无法重写Abc中的静态方法 为什么静态方法不能被实例方法覆盖?

  • 当我用公共方法重写受保护的方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法?

  • 这是另一个非常经典的 java 多线程面试问题,而且在面试中会经常被问到。很简单,但是很多人都会答不上来! new 一个 Thread,线程进入了新建状态。调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 而直接执行 run() 方法,会把 r

  • 本文向大家介绍为什么方法不能根据返回类型来区分重载?相关面试题,主要包含被问及为什么方法不能根据返回类型来区分重载?时的应答技巧和注意事项,需要的朋友参考一下 我们来看以下的代码: 在Java语言中,调用一个方法,即使这个方法有返回值,我们也可以不接收这个返回值,例如以上两个方法doSome(),在testMethod()中调用的时候,Java编译器无法区分调用的具体是哪个方法。所以对于编译器来说