Java变量

时间:2020-02-23 14:37:00  来源:igfitidea点击:

Java varargs是Java 1.5中引入的。
Java varargs也称为Java变量参数。

Java变量

Java中的varargs使方法可以接受可变数量的参数。
我们在方法签名中使用三个点(…)(也称为省略号)以使其接受可变参数。
例如;

public static int sum(int i, int...js ){
//do something
}

关于Java中的varargs的要点

关于Java中的varargs的几点知识是:

  • 该方法中只能有一个可变参数。

  • 方法的最后一个参数只能是varargs。

  • 根据Java文档,我们不应重载varargs方法。
    我们将了解为什么它不是一个好主意。

java varargs如何工作?

当我们调用带有可变参数的方法时,java编译器会从左到右匹配参数。
到达最后一个varargs参数后,它将创建剩余参数的数组并将其传递给方法。
实际上,varargs参数的行为类似于指定类型的数组。

//method with variable arguments
public static int sum(int i, int...js ){
  int sum = i;
  for(int x : js){
      sum+=x;
  }
  return sum;
}

//method with same implementation as sum with array as argument
public static int sumArray(int i, int[] js ){
  int sum = i;
  for(int x : js){
      sum+=x;
  }
  return sum;
}

如果同时查看sum和sumArray方法,您会发现实现主体是完全相同的。
因此,当API提供它们时,我们应该使用varargs,例如java.io.PrintStream.printf()方法,但我们不应该将其替代数组。

为什么我们不应该重载varargs方法

让我们看一个示例,为什么重载java varargs方法不是一个好主意。

package com.theitroad.misc;

public class VarargsExample {

  public static void main(String[] args) {
      System.out.println(sum(1));
      System.out.println(sum(1,2)); //compiler error, ambiguous method

  }

  public static int sum(int i, int...js ){
      System.out.println("sum1 called");
      int sum = i;
      for(int x : js){
          sum+=x;
      }
      return sum;
  }
  public static int sum(int i, int k, Object...js ){
      System.out.println("sum2 called");
      int sum = i+k;
      for(Object x : js){
          sum+=1;
      }
      return sum;
  }
  
}

在上面的示例中,您会注意到当我们使用varargs重载方法时,编译器不会抱怨。
但是,当我们尝试使用它时,编译器在映射第二个参数时会感到困惑。

如果只有一个参数,则编译器很聪明地使用第一个方法,因为它可以使用最少一个参数,但是第二个方法至少需要两个参数。
Eclipse的下图显示了错误消息,因为对于类型为VarargsExample的方法,sum(int,int [])方法不明确。