最近我被问到一个问题:“为什么要重写一个方法?”
我回答说,如果我有一个类有十个方法,我想使用其中所有的功能,除了一个方法,那么我就会重写那个方法来实现自己的功能。
然后面试官问道:既然如此,为什么不能编写一个新方法,并给它取一个不同的名称,然后使用该方法呢?
是的,这也是对的。现在我感到困惑了。重写一个方法的真正目的是什么?
请问有人能告诉我吗?非常感谢!
最近我被问到一个问题:“为什么要重写一个方法?”
我回答说,如果我有一个类有十个方法,我想使用其中所有的功能,除了一个方法,那么我就会重写那个方法来实现自己的功能。
然后面试官问道:既然如此,为什么不能编写一个新方法,并给它取一个不同的名称,然后使用该方法呢?
是的,这也是对的。现在我感到困惑了。重写一个方法的真正目的是什么?
请问有人能告诉我吗?非常感谢!
Base p = new Derived();
p.overrideMethod();
如果派生类从基类继承,那么它将自动调用派生版本而不是基础版本。如果名称不同,则不可能这样做。这被称为针对接口而非实现的编码。
.
由于我们想使用多态性,所以不能编写一个使用不同名称的新方法并使用该方法。您可以告诉面试官这个例子:有一个模块调用您提供的对象上的特定方法;现在想象一下,您无法更改该模块(例如没有源代码)。您无法告诉它使用不同的方法,但是您可以提供一个覆盖该方法的子类对象。对于该模块,看起来什么都没有改变。在实践中,通常情况下您可能可以更改该模块,但却不想这样做。接口可以允许多个实现,而覆盖则可以简化接口的实现(例如,在实现WindowListener时,通常会扩展并覆盖WindowAdapter的方法,以便在默认行为足够的情况下不需要提供定义)。在这种情况下,添加新方法而不是覆盖将无法工作,因为调用者了解接口并调用其方法;在此处覆盖的整个重点是更改对接口的调用的行为。如果您只是添加了一个新函数,则调用者必须知道它,这就破坏了消费功能和提供该功能的提供者之间的完全隔离,这正是接口旨在提供的。
覆盖是在使用继承时可用的一项功能。
当一个类继承自另一个类并希望在大多数情况下使用父类的大部分特性,但在某些情况下希望实现特定功能时,就可以使用它。
在这种情况下,我们可以创建与父类中名称和签名相同的方法。这样新方法就会掩盖父方法,并且默认情况下将被调用。
覆盖的主要目标是代码重用性,这在大型项目中非常有优势,它还提供了灵活性,意味着您可以从任何类传递不同的输入集并获得输出。