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