Java中什么是可变参数
创始人
2024-12-25 13:21:11
0次

  Java 的可变参数究竟是怎么一回事?可变参数是 Java 1.5 的时候引入的功能,它允许方法使用任意多个、类型相同(is-a)的值作为参数。就像下面这样。

  public static void main(String[] args) {

  print("沉");

  print("沉", "默");

  print("沉", "默", "王");

  print("沉", "默", "王", "二");

  }

  public static void print(String... strs) {

  for (String s : strs)

  System.out.print(s);

  System.out.println();

  }

  静态方法 print() 就使用了可变参数,所以 print("沉") 可以,print("沉", "默") 也可以,甚至 3 个、 4 个或者更多个字符串都可以作为参数传递给 print() 方法。

  说到可变参数,我想起来阿里巴巴开发手册上有这样一条规约。

  意思就是尽量不要使用可变参数,如果要用的话,可变参数必须要在参数列表的最后一位。既然坑位有限,只能在最后,那么可变参数就只能有一个(悠着点,悠着点)。如果可变参数不在最后一位,IDE 就会提示对应的错误,如下图所示。

  那可变参数是怎么工作的呢?

  原理也很简单。当使用可变参数的时候,实际上是先创建了一个数组,该数组的大小就是可变参数的个数,然后将参数放入数组当中,再将数组传递给被调用的方法。

  这就是为什么可以使用数组作为参数来调用带有可变参数的方法的根本原因。代码如下所示。

  public static void main(String[] args) {

  print(new String[]{"沉"});

  print(new String[]{"沉", "默"});

  print(new String[]{"沉", "默", "王"});

  print(new String[]{"沉", "默", "王", "二"});

  }

  public static void print(String... strs) {

  for (String s : strs)

  System.out.print(s);

  System.out.println();

  }

  那如果方法的参数是一个数组,然后像使用可变参数那样去调用方法的时候,能行得通吗?大家感兴趣的话,不妨试一试(行不通,嘘)。

  那一般什么时候使用可变参数呢?

  可变参数,可变参数,顾名思义,当一个方法需要处理任意多个相同类型的对象时,就可以定义可变参数。Java 中有一个很好的例子,就是 String 类的 format() 方法,就像下面这样。

  System.out.println(String.format("年纪是: %d", 18));

  System.out.println(String.format("年纪是: %d 名字是: %s", 18, "沉默王二"));

  PS:%d 表示将整数格式化为 10 进制整数,%s 表示输出字符串。

  如果不使用可变参数,那需要格式化的参数就必须使用“+”号操作符拼接起来了。麻烦也就惹祸上身了。

  在实际的项目代码中,开源包 slf4j.jar 的日志输出就经常要用到可变参数(log4j 就没法使用可变参数,日志中需要记录多个参数时就痛苦不堪了)。就像下面这样。

  protected Logger logger = LoggerFactory.getLogger(getClass());

  logger.debug("名字是{}", mem.getName());

  logger.debug("名字是{},年纪是{}", mem.getName(), mem.getAge());

  查看源码就可以发现,debug() 方法使用的可变参数。

  public void debug(String format, Object... arguments);

  那在使用可变参数的时候有什么注意事项吗?

  有的,有的。我们要避免重载带有可变参数的方法——这样很容易让编译器陷入自我怀疑中

  public static void main(String[] args) {

  print(null);

  }

  public static void print(String... strs) {

  for (String a : strs)

  System.out.print(a);

  System.out.println();

  }

  public static void print(Integer... ints) {

  for (Integer i : ints)

  System.out.print(i);

  System.out.println();

  }

  这时候,编译器完全不知道该调用哪个 print() 方法,print(String... strs) 还是 print(Integer... ints),傻傻分不清。

  假如真的需要重载带有可变参数的方法,就必须在调用方法的时候给出明确的指示,不要让编译器去猜。

  public static void main(String[] args) {

  String [] strs = null;

  print(strs);

  Integer [] ints = null;

  print(ints);

  }

  public static void print(String... strs) {

  }

  public static void print(Integer... ints) {

  }

  上面这段代码是可以编译通过的。因为编译器知道实参是 String 类型还是 Integer 类型,只不过为了运行时不抛出 NullPointerException,两个 print() 方法的内部要做好判空的操作。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...