Answers:
要使用新方法重载方法,新方法应具有不同的签名。即,两个重载方法具有相同的名称,但参数不同。这是两个重载方法的示例:
boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };
根据参数类型,将调用相应的方法。请注意,更改返回类型还不够(尽管您可以额外执行此操作)。
重写方法时,新方法具有相同的签名,并在某些情况下替换重写的方法。这是一个重写方法的示例:
public class A
{
public void someMethod() { ... }
}
public class B extends A
{
public void someMethod() { ... }
}
根据对象类型进行选择。例如,
A someA = new B();
someA.someMethod();
会叫someMethod
的B
。您可以(并且应该)添加@Override批注:
public class B extends A
{
@Override
public void someMethod() { ... }
}
现在,如果您不小心更改了B中的参数,则编译器将通知您,您不是要覆盖someMethod()而是将其重载。
Java教程涵盖了您所要求的概念。
覆盖说明如下:
子类中具有相同签名(名称,加上数字和其参数的类型)且返回类型作为超类中的实例方法的实例方法将覆盖超类的方法。
子类重写方法的能力使类可以从行为“足够接近”的超类继承,然后根据需要修改行为。覆盖方法与其覆盖的方法具有相同的名称,数量和参数类型,以及返回类型。重写方法还可以返回重写方法返回的类型的子类型。这称为协变返回类型。
覆盖方法时,可能需要使用
@Override
注释,该注释指示编译器打算覆盖超类中的方法。如果由于某种原因,编译器检测到该方法在超类之一中不存在,则它将生成错误。有关更多信息@Override
,请参见注释 ...。
重载在教程中说明如下:
Java编程语言支持重载方法,Java可以区分具有不同方法签名的方法。这意味着,如果类中的方法具有不同的参数列表,则它们可以具有相同的名称(对此有一些限定条件,将在标题为“接口与继承”的课程中进行讨论)。
假设您有一个类,可以使用书法来绘制各种类型的数据(字符串,整数等),并且包含一个用于绘制每种数据类型的方法。这是麻烦的使用一个新的名称为每个方法,例如,
drawString
,drawInteger
,drawFloat
,等。在Java编程语言中,您可以对所有绘图方法使用相同的名称,但可以将不同的参数列表传递给每个方法。因此,数据绘图类可能会声明四个名为的方法draw
,每个方法都有一个不同的参数列表...重载的方法通过传递给方法的参数的数量和类型来区分...
您不能声明多个具有相同名称,相同数量和类型的参数的方法,因为编译器无法区分它们。
区分方法时,编译器不会考虑返回类型,因此即使两个方法具有不同的返回类型,也无法声明具有相同签名的两个方法。
注意:应该谨慎使用重载的方法,因为它们会使代码的可读性大大降低。
上面关于重载的解释提到了在“接口与继承”课程中讨论的限定条件:
在子类中,您可以重载从超类继承的方法。这样的重载方法既不会隐藏也不会覆盖超类方法,它们是子类独有的新方法。
重载方法通常定义为“提供具有相同名称,输入和输出的数量和类型不同的多个可用方法”。这个概念通常是希望在给定不同输入集的情况下能够执行相同的基本操作:例如,您可以“将”两个数字类型的值“相加”,但是通常重要的是要知道数字类型的确切类型该值是使您可以利用或计划该类型的特定行为。这样,您将为希望支持的数字类型(和/或集合)的每种组合定义一个方法。所有这些方法都具有相同的名称,但是具有不同的“签名”。在编译时
覆盖方法通常定义为“在方法的派生类中提供具有在基类中定义的特定签名的不同实现”。有许多原因可以覆盖方法。实际上,它们都具有一个共同点,即派生类具有必须执行的附加知识,而基类无法知道。在大多数OO语言中,有两种重写的方法:覆盖可以替代基类方法,也可以扩展基类方法。区别通常在于,扩展基类实现的派生类将在执行覆盖方法的某个时候调用基类的方法的覆盖版本。这允许覆盖的类“重用”包含在基类中的公共操作区域。