Java 为什么我们要重写一个方法?

Java 为什么我们要重写一个方法?,java,oop,overriding,Java,Oop,Overriding,最近有人问我这样一个问题:“为什么要重写一个方法?” 我回答说,如果我有一个包含10个方法的类,并且我想使用除一个方法之外的所有功能,那么我将重写该方法以拥有我自己的功能 然后面试官回答说,既然如此,为什么我们不能用一个不同的名字写一个新方法,然后改用那个方法呢 是的,这也是对的。现在我很困惑。重写方法的真正目的是什么 谁能告诉我?提前谢谢大家 如果要为派生类中的方法指定另一个名称,则不能使用相同的接口调用它。您始终可以通过基类指针调用它 i、 e 如果派生类是从Base派生的,那么它将自动调用

最近有人问我这样一个问题:“为什么要重写一个方法?”

我回答说,如果我有一个包含10个方法的类,并且我想使用除一个方法之外的所有功能,那么我将重写该方法以拥有我自己的功能

然后面试官回答说,既然如此,为什么我们不能用一个不同的名字写一个新方法,然后改用那个方法呢

是的,这也是对的。现在我很困惑。重写方法的真正目的是什么


谁能告诉我?提前谢谢大家

如果要为派生类中的方法指定另一个名称,则不能使用相同的接口调用它。您始终可以通过基类指针调用它

i、 e


如果派生类是从Base派生的,那么它将自动调用派生版本而不是Base。如果名称不同,则不可能。重写的好处是:能够定义特定于子类类型的行为,这意味着子类可以根据其需求实现父类方法

我回答说,如果我有一个包含10个方法的类,我想使用所有的方法 它的功能除了一个方法,然后我将覆盖该方法 拥有我自己的功能

=>通常是一种打破…=>非常糟糕的OO设计


网络上有很多关于这个“中断”的例子,但是你可以找到一个很好的解释。

一个使用接口来允许多个实现,另一个使用覆盖来简化接口的实现(例如,在实现时,通常会扩展和重写的方法,以便在默认行为足够的情况下不需要提供定义)。在这种情况下,添加一个新方法而不是重写将不起作用,因为调用方理解接口并调用其方法;这里重写的全部要点是更改接口调用的行为。如果只是添加一个新函数,那么调用方必须知道它,这将破坏整个isolat一项功能的使用者和该功能的提供者之间的交互,这就是接口要提供的功能。

重写是使用继承时可用的功能

当从另一个类扩展而来的类希望使用父类的大部分功能,并希望在某些情况下实现特定功能时,可以使用它。

在这种情况下,我们可以创建与父类具有相同名称和签名的方法。这样,新方法将屏蔽父方法,并在默认情况下被调用。

为什么我们不能用一个不同的名称编写一个新方法,然后改用那个方法呢

这是因为我们想使用多态性。你可以告诉面试官这个例子:有一个模块对你给它的对象调用特定的方法;现在想象一下你不能改变这个模块(例如,没有来源)。你不能告诉它使用不同的方法,但你可以给它一个子类的对象,该子类已经覆盖了该方法。对模块来说,似乎没有任何改变


在实践中,通常情况下,您可以更改该模块,但不想更改。

重写的主要目标是代码的可重用性,这在大型项目中是非常有用的,它还提供了灵活性,意味着您可以从任何类传递不同的输入集,并获得输出。

继承是我想到的,告诉面试官,应该始终根据接口而不是实现进行编码:)来更改实现。重写已经实现的方法通常是破坏Liskov替换原则(非常糟糕的设计)的根本原因。一般来说,我们“覆盖”/(更合适的说法是实现)接口/抽象方法。我知道这是开玩笑的,但它根本没有解决这个问题。
Base p = new Derived();
p.overrideMethod();