我不明白Java中的重载。与多态性有关系吗?这对我来说似乎很抽象。我更多来自 Javascript 语言?这适用于 Javascript 吗?
4 回答
重载意味着可以使用多个签名定义相同的方法名称——形式参数列表(及其类型)。
重载在不同的语言中意味着不同的东西。Java 是强类型的(实际上有些人可能会说“强类型”)。这只是意味着一个函数可以有不同的版本,编译器可以通过查看函数(方法)调用中的参数类型来判断哪个版本是预期的。
JavaScript 不是那样的。函数的形式参数只是函数体中的名称引用,但除此之外它们没有什么特别之处,任何函数都可以用任何参数和任意数量的参数调用。
一些语言使用“重载”作为运行时概念。在 Erlang 中,从函数的多个替代版本中进行选择时,参数的类型并不重要。这是价值观。
编辑——@MarkoTopolnik 指出问题不在于类型系统的“强度”(或“凶猛”:-),而在于它的静态程度。Java 坚持几乎在任何地方都明确声明类型,而 JavaScript(一些新的类型化数组结构除外)则不然。
具有多个定义的同名方法称为重载
可能与参数类型和参数数量不同。
例子
import java.io.*;
class demoOverloading
{
int add(int x,int y) //method definition
{
return (x+y);
}
double add(double x,double y) //method definition
{
return (x+y);
}
}
public class JavaApplication4
{
public static void main(String[] args)
{
demoOverloading demo=new demoOverloading(); //creating object for above class
System.out.println("Sum of Integer "+demo.add(10,20)); //calling integer add method
System.out.println("Sum of double "+demo.add(33.44,67.5)); //calling double add method
}
}
上面的例子有两个同名的方法add但一个包含 int 另一个包含双参数,像这样我们可以用不同的参数,,
也可能在参数数量上有所不同..
谢谢
重载是允许在一个类中有两个具有相同名称和不同签名的方法的功能,例如
public void foo();
public void foo(int i);
现在您可以调用foo()
不带参数或带一个 int 参数的方法,并且将执行不同的方法。
您可能对重载和覆盖感到困惑。压倒一切确实与多态性有关。这是将基类的功能覆盖(更改)为子类的能力。例如,如果Child extends Base
和两者都有方法foo()
,则foo()
子项会覆盖 Base 的实现。JavaScript 中确实存在类似的功能。
如果您在课堂上有以下方法
public void calculate() {}
以下是它的一些重载版本。(注意同名)
public void calculate(int i) {}
public void calculate(int i, int j) {}
但以下不是上述方法的重载之一。此方法与原始方法的不同之处仅在于返回类型。java中不允许具有相同签名但具有不同返回类型的方法。
public int calculate(int i) {}