最近我被问到这个问题"为什么要覆盖一个方法? "
我回答说,如果我有一个包含10个方法的类,并且我想使用除一个方法之外的所有功能,那么我将覆盖该方法以拥有自己的功能。
然后面试官在那种情况下回答为什么我们不能用不同的名字写一个新方法而是使用那种方法。
是的,这也是对的。现在我很困惑。覆盖方法的真正目标是什么?
有人可以告诉我吗?谢谢大家。
答案 0 :(得分:4)
好吧,告诉你的面试官应该始终对接口进行编码,而不是实现:)
答案 1 :(得分:3)
如果要为派生类中的方法指定另一个名称,则无法使用相同的接口调用它。您始终可以通过基类指针调用它。
即
Base p = new Derived();
p.overrideMethod();
如果Derived类是从Base派生的,那么它将自动调用派生版本而不是Base。如果名称不同,则无法进行。它被称为针对接口而不是实现的代码。
答案 2 :(得分:1)
我回答说,如果我有一个有10种方法的课程,我想要全部使用 它的功能除了一个方法,然后我将覆盖该方法 拥有自己的功能。
=>通常是一种打破Liskov Substitution principle ... =>的方法非常差的OO设计
你在网上有很多例子" break"但你可以找到一个很好的解释here。
答案 3 :(得分:1)
为什么我们不能用不同的名称编写一个新方法而是使用该方法
这是因为我们想要使用多态。你可以告诉采访者这个例子:有一个模块在你给它的对象上调用特定的方法;现在想象你不能改变那个模块(例如没有来源)。你不能告诉它使用不同的方法,但你可以给它一个子类的对象,它已经覆盖了那个方法。对于模块,它似乎没有任何改变。
在实践中,通常情况是可以更改该模块但不想要。
答案 4 :(得分:0)
覆盖的好处是:能够定义特定于子类类型的行为,这意味着子类可以根据其需求实现父类方法。
答案 5 :(得分:0)
一个使用接口来允许多个实现,一个使用重写来简化接口的实现(例如,当实现WindowListener时,通常会扩展并覆盖WindowAdapter的方法,以便一个不需要为默认行为足够的情况提供定义)。在这种情况下,添加新方法而不是覆盖将不起作用,因为调用者理解接口并调用其方法;覆盖的重点是改变对接口调用的行为。如果您只是添加了一个新函数,那么调用者就必须知道它,这会破坏一个功能的使用者和该功能的提供者之间的整个隔离,这是接口的目的。
答案 6 :(得分:0)
覆盖是使用继承时可用的功能。
当从另一个类扩展的类想要使用父类的大部分功能并希望在某些情况下实现特定功能时使用它。
在这种情况下,我们可以创建与父类具有相同名称和签名的方法。这样,新方法将屏蔽父方法,并且默认情况下将被调用。
答案 7 :(得分:0)
覆盖的主要目标是代码重用性,这在大型项目中可能是有利的,它还提供灵活性意味着您可以从任何类传递不同的输入集并获得输出