📜  Java重载Overload

📅  最后修改于: 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


问:如果确切的原型与参数不匹配怎么办?

答案:按照优先级别考虑,编译器采取以下步骤:

  1. 类型转换,但转换为同一系列中的更高类型(就范围而言)。
  2. 类型转换为下一个更高的类(假设如果没有长数据类型可用于int数据类型,则它将搜索float数据类型)。

让我们举个例子来澄清这个概念:

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