Java中的方法重载

时间:2020-01-09 10:34:45  来源:igfitidea点击:

在Java中,如果它们的参数的类型或者数字不同,则可以在同一个类中使用两个或者更多个具有相同名称的方法。这些类型的方法称为重载方法,该过程在Java中称为方法重载。

Java中的方法重载–符合重载方法的条件

1Java中的重载方法可以具有不同数量的参数。

add(int a, int b);
add(int a, int b, int c);

2Java中的重载方法也可能因参数类型而异。

add(int a, int b);
add(float a, float b);

3即使参数的数量和类型相同,但它们的显示方式不同,方法也被视为重载。

add(int a, float b);
add(float a, int b);

4如果子类的方法与父类具有相同的名称,但参数不同,那么这也是Java中的方法重载。请注意,如果方法在父类和子类中具有相同的名称和相同数量的参数,则在Java中将其称为方法重写。

Java中的方法重载–什么不算方法重载

如果类中的方法仅在返回类型上有所不同,则这些方法不被视为重载方法。

public int add(int a, float b);
public float add(int a, float b);

在这两个add方法中,参数的数量和类型均相同,仅返回类型不同,因此不将其视为重载方法。

调用正确的重载方法

通过方法重载支持Java中的静态或者编译时多态性。在编译时,使用参数的类型和/或者数量将对重载方法的调用绑定到正确的方法。

Java中的方法重载–参数数量不同的示例

public class OverloadingDemo {

  public static void main(String[] args) {
    OverloadingDemo od = new OverloadingDemo();
    // Calling add method with 2 arguments
    System.out.println("Add- "+ od.add(6, 11));
    // Calling add method with 3 arguments
    System.out.println("Add- "+ od.add(5, 12, 9));
  }

  private int add(int a, int b) {
    return a+b;
  }

  private int add(int a, int b, int c) {
    return a+b+c;
  }
}

输出:

Add- 17
Add- 26

Java中的方法重载–参数类型不同的示例

public class OverloadingDemo {

  public static void main(String[] args) {
    OverloadingDemo od = new OverloadingDemo();
    // Calling add method with 2 arguments
    System.out.println("Add- "+ od.add(6, 11));
    // Calling add method with double arguments
    System.out.println("Add- "+ od.add(5.3, 22));
  }

  private int add(int a, int b) {
    return a+b;
  }

  private double add(double a, double b) {
    return a+b;
  }
}

输出:

Add- 17
Add- 27.3

Java中的方法重载-继承示例

对于继承,如果父类和子类都具有名称相同但参数不同的方法,则该方法也被视为重载。

class A {
  public int add(int a, int b) {
    System.out.println("in add method of the parent class" );
    return a+b;
  }
}

public class B extends A{
  public int add(int a, int b, int c) {
    System.out.println("in add method of the child class" );
    return a+b+c;
  }
    

  public static void main(String[] args) {
    B obj = new B();
    System.out.println("Add- " + obj.add(9, 3));
    System.out.println("Add- " + obj.add(9, 3, 11));
  }
}

输出:

in add method of the parent class
Add- 12
in add method of the child class
Add- 23

在使用B类型的对象时,调用带有两个参数的add方法时,将调用父类add方法。调用带有三个参数的add方法时,将调用子类add方法。

Java中的方法重载和自动类型提升

调用重载方法时,Java会尝试查找具有精确匹配参数(计数和类型明智)的方法。如果找不到完全匹配的内容,Java会尝试通过提升方法的数据类型并寻找具有更高数据类型的方法来解决方法调用。在自动类型提升中,如果方法调用仍未解决,则类型提升为下一个最高类型,然后提升为下一个最高类型。自动数字类型升级的顺序如下
字节–短–整数–长浮点–双精度

让我们尝试通过一个示例来清除它。

public class OverloadingDemo {

  public static void main(String[] args) {
    OverloadingDemo od = new OverloadingDemo();
    // Calling add method with three int arguments
    System.out.println("Add- "+ od.add(5, 22, 12));
  }

  private int add(int a, int b) {
    System.out.println("in add method with int args");
    return a + b;
  }

  private float add(float a, float b, float c) {
    System.out.println("in add method with float args");
    return a + b + c;
  } 
  private double add(double a, double b, double c) {
    System.out.println("in add method with double args");
    return a + b + c;
  }
}

输出:

in add method with float args
Add- 39.0

在这里,我们有三个重载的add()方法,其中两个具有三个参数,一个具有浮点型参数,另一个具有double型参数。调用了具有3个int参数的add()方法,因为不存在具有3个int参数的add方法,因此在将int自动提升为float之后,将调用具有三个float参数的add方法。

由于float在类型层次结构中位于double之前,因此将调用具有float参数的方法。