📅  最后修改于: 2020-03-19 12:06:56             🧑  作者: Mango
重载允许不同的方法具有相同的名称,但签名不同,其中签名可能因输入参数的数量或输入参数的类型或两者而不同。重载与编译时(或静态)多态性有关
// Java展示重载
public class Sum {
// 重载sum()
public int sum(int x, int y)
{
return (x + y);
}
// 重载sum(),接受三个参数
public int sum(int x, int y, int z)
{
return (x + y + z);
}
// 重载sum(),接受2个double
public double sum(double x, double y)
{
return (x + y);
}
// 测试代码
public static void main(String args[])
{
Sum s = new Sum();
System.out.println(s.sum(10, 20));
System.out.println(s.sum(10, 20, 30));
System.out.println(s.sum(10.5, 20.5));
}
}
输出:
30
60
31.0
问:如果确切的原型与参数不匹配怎么办?
答案:按照优先级别考虑,编译器采取以下步骤:
让我们举个例子来澄清这个概念:
class Demo {
public void show(int x)
{
System.out.println("int内" + x);
}
public void show(String s)
{
System.out.println("String内" + s);
}
public void show(byte b)
{
System.out.println("byte内" + b);
}
}
class UseDemo {
public static void main(String[] args)
{
byte a = 25;
Demo obj = new Demo();
obj.show(a);
obj.show("hello"); // String
obj.show(250); // Int
obj.show('A'); // 因为没有char类,所以数据类型比char更高的是int类
obj.show("A"); // String
obj.show(7.5); // 因为没有float类,所以这里会报错
}
}
有什么好处?
我们不必为执行相同操作的函数创建和记住不同的名称。例如,在我们的代码中,如果Java不支持重载,则必须创建方法名称,例如sum1,sum2,…或sum2Int,sum3Int,…等。
我们可以在返回类型上重载方法吗?
我们不能按返回类型重载,此行为在C++中是相同的。
public class Main {
public int foo() { return 10; }
// 编译错误error: foo() 已被定义
public char foo() { return 'a'; }
public static void main(String args[])
{
}
}
但是,在显式指定调用函数的数据类型的情况下,可以在返回类型上重载方法。看下面的例子:
// Java重载static方法
public class Main {
public static int foo(int a) { return 10; }
public static char foo(int a, int b) { return 'a'; }
public static void main(String args[])
{
System.out.println(foo(1));
System.out.println(foo(1, 2));
}
}
输出:
10
a
// Java展示方法的重载
class A {
public int foo(int a) { return 10; }
public char foo(int a, int b) { return 'a'; }
}
public class Main {
public static void main(String args[])
{
A a = new A();
System.out.println(a.foo(1));
System.out.println(a.foo(1, 2));
}
}
输出:
10
a
我们可以重载静态方法吗?
答案是“ 是 “。我们可以使用名称相同但输入参数不同的两个或多个静态方法。例如,考虑以下Java程序。
我们可以仅通过static关键字重载不同的方法吗?
在Java中我们不能超载两种方法,如果他们的区别仅限于关键字static。例如,请参见以下Java程序。
我们可以在Java中重载main()吗?
像其他静态方法一样,我们可以 在Java中重载main()。
// Java展示重载main()
import java.io.*;
public class Test {
// 常规main()
public static void main(St