Java教程21—Java中的方法重载

方法重载是一种功能,如果类的参数列表不同,则允许类具有多个具有相同名称的方法。
它类似于Java中的构造函数重载,它允许类具有多个具有不同参数列表的构造函数。

让我们回到这一点,当我说参数列表时它意味着方法具有的参数:
例如,具有两个参数的方法add(int a,int b)的参数列表与方法add的参数列表不同(int a,int b,int c)具有三个参数。


重载方法的三种方法

为了重载方法,方法的参数列表必须在以下任何一个方面有所不同:
1.参数数量。
例如:这是一个有效的重载情况

add (int ,int )
add (int ,int ,int

2.参数的数据类型。
例如:

add (int ,int )
add (int ,float

3.参数的数据类型顺序。
例如:

add (int ,float )
add (float ,int

方法重载的无效情况:
当我说参数列表时,我不是在谈论方法的返回类型.
例如,如果两个方法具有相同的名称,相同的参数和不同的返回类型,那么这不是一个有效的方法重载示例。这将抛出编译错误。

int add (int ,intfloat add (int ,int

方法重载是静态多态的一个例子。我们将在单独的教程中讨论多态性及其类型。

注意事项:
1. 静态多态性也称为编译时绑定或早期绑定。
2. 静态绑定在编译时发生。方法重载是静态绑定的一个示例,其中方法调用与其定义的绑定在编译时发生。


方法重载示例

如本指南开头所述,方法重载是通过使用不同参数声明相同方法来完成的。
参数在以下任何一个中都必须不同:参数(或参数)的数量,顺序或类型。让我们看看每种情况的例子。


示例1:重载 - 参数列表中的参数数量不同

此示例显示了如何通过具有不同数量的参数来完成方法重载

class DisplayOverloading
{
    public void disp(char c)
    {
        System.out.println(c);
    }
    public void disp(char c, int num)
    {
        System.out.println(c + " "+num);
    }
}

class Sample
{
    public static void main(String args[])
    {
        DisplayOverloading obj = new DisplayOverloading();
        obj.disp('a');
        obj.disp('a',10);
    }
}

Output:

        a
        a 10

在上面的例子中 - 方法disp()根据参数的数量重载 - 我们有两个名称的方法,disp但它们的参数是不同的。两者都具有不同数量的参数。


示例2:重载 - 参数的数据类型不同

在此示例中,方法disp()基于参数的数据类型进行重载 - 我们有两个名为disp()的方法,一个使用char类型的参数,另一个方法使用int类型的参数。

class DisplayOverloading2
{
    public void disp(char c) {
        System.out.println(c);
    }
    public void disp(int c){
        System.out.println(c );
    }
}

class Sample2
{
    public static void main(String args[]) {
        DisplayOverloading2 obj = new DisplayOverloading2();
        obj.disp('a');
        obj.disp(5);
    }
}
Output:

        a
        5

示例3:重载 - 参数的数据类型顺序不同

这里的方法disp()根据参数的数据类型序列重载 - 这两种方法在参数列表中都有不同的数据类型序列。
第一种方法是将参数列表作为(char,int),第二种方法是使用(int,char)。
由于序列不同,该方法可以重载而没有任何问题。

class DisplayOverloading3
{
    public void disp(char c, int num) {
        System.out.println("I’m the first definition of method disp");
    }
    public void disp(int num, char c) {
        System.out.println("I’m the second definition of method disp" );
    }
}
class Sample3
{
    public static void main(String args[]) {
        DisplayOverloading3 obj = new DisplayOverloading3();
        obj.disp('x', 51 );
        obj.disp(52, 'y');
    }
}
Output:
    I’m the first definition of method disp
    I’m the second definition of method disp

方法重载和类型提升

当较小的数据类型被提升为比这更大的数据类型时称为类型提升,例如:字节数据类型可以提升为short,short类型可以提升为int,long,double等。

它与方法重载有什么关系?
好吧,理解类型提升是非常重要的,否则你会认为程序会抛出编译错误,但实际上程序会因类型提升而运行正常。
让我们举一个例子,看看我在这里说的是什么:

class Demo
{
    void disp(int a, double b){
        System.out.println("Method A");
    }
    void disp(int a, double b, double c){
        System.out.println("Method B");
    }
    public static void main(String args[]){
        Demo obj = new Demo();
        /* 对第二个参数传递了一个浮点型
         * 但是被提升为double了
         * 因为没有匹配的方法(int, float)
         */
        obj.disp(100, 20.67f);
    }
}

输出:

Method A

正如你可以看到,传递浮点值运行通过了,同时调用了disp()方法。

但是这种类型的提升并不总是发生的,让我们看另一个例子:

class Demo
{
    void disp(int a, double b){
        System.out.println("Method A");
    }
    void disp(int a, double b, double c){
        System.out.println("Method B");
    }
    void disp(int a, float b){
        System.out.println("Method C");
    }
    public static void main(String args[]){
        Demo obj = new Demo();
        /*
         * 有参数为(int, float)的方法,就不会提升了
         */
        obj.disp(100, 20.67f);
    }
}

输出:

Method C

如您所见,此时类型提升未发生,因为存在具有匹配参数类型的方法。


类型提升表
左侧的数据类型可以升级为右侧的任何数据类型。

byteshortintlong
shortintlong
intlongfloatdouble
floatdouble
longfloatdouble

让我们看几个有效或者无效的方法重载情况

案例1:

int mymethod(int a, int b, float c)
int mymethod(int var1, int var2, float var3) 

结果:编译时间错误。参数列表完全相同。
两种方法都具有相同的数字,数据类型和相同的数据类型序列。


案例2:

int mymethod(int a, int b)
int mymethod(float var1, float var2)

结果:非常好。有效的重载情况。这里参数的数据类型是不同的。


案例3:

int mymethod(int a, int b)
int mymethod(int num)

结果:非常好。有效的重载情况。这里的参数数量不同。


案例4:

float mymethod(int a, float b)
float mymethod(float var1, int var2)

结果:非常好。有效的重载情况。参数的数据类型的顺序是不同的,第一种方法是(int,float),第二种方法是(float,int)。


案例5:

int mymethod(int a, int b)
float mymethod(int var1, int var2)

结果:编译时间错误。参数列表完全相同。
尽管返回类型的方法不同,但它不是有效的情况。
由于返回类型的方法在重载方法时是无关紧要的。


在程序结束前检查答案之前猜测答案
问题1 - 返回类型,方法名称和参数列表相同。

class Demo
{
    public int myMethod(int num1, int num2)
    {
        System.out.println("First myMethod of class Demo");
        return num1+num2;
    }
    public int myMethod(int var1, int var2)
    {
        System.out.println("Second myMethod of class Demo");
        return var1-var2;
    }
}
class Sample4
{
    public static void main(String args[])
    {
        Demo obj1= new Demo();
        obj1.myMethod(10,10);
        obj1.myMethod(20,12);
    }
}

答案:
它将抛出一个编译错误:不能在同一个类中定义多个具有相同名称和参数列表的方法。


问题2 - 返回类型不同。方法名称和参数列表相同。

class Demo2
{
    public double myMethod(int num1, int num2)
    {
        System.out.println("First myMethod of class Demo");
        return num1+num2;
    }
    public int myMethod(int var1, int var2)
    {
        System.out.println("Second myMethod of class Demo");
        return var1-var2;
    }
}
class Sample5
{
    public static void main(String args[])
    {
        Demo2 obj2= new Demo2();
        obj2.myMethod(10,10);
        obj2.myMethod(20,12);
    }
}

答案:
它会抛出一个编译错误:即使返回类型不同,也不能在类中给出多个具有相同名称和参数列表的方法。方法返回类型在重载的情况下无关紧要。


原文地址:

https://beginnersbook.com/2013/05/method-overloading/

猜你喜欢

转载自blog.csdn.net/y396397735/article/details/82555683
今日推荐