# 每天一分鐘來一顆Java語法糖(三)不定項參數

每天一分鐘來一顆Java語法糖(三)不定項參數

不定項參數引入版本

  • Java1.5增加了新特性:可變參數

不定項參數介紹

不定項參數:適用於參數個數不確定,類型確定的情況,Java把可變參數當做數組處理。

不定項參數注意事項:

  1. 不定項參數必須放在參數列表最後一個。
  2. 不定項參數只能有一個(多個,必然有一個不是最後一個)。
  3. 重載時,運行優先級問題(確定參數的方法優先級高於不定項參數的方法)。

不定項參數演示

public class Test {
    public static void main(String[] args) {
        print("大少", "二少");
        String[] names = {"大少", "二少"};
        printArray(names);
        print("大少 ");
    }

    public static void print(String... names) {
        System.out.println("不定項");
    }

    public static void printArray(String[] names) {
        System.out.println("數組");
    }

    public static void print(String name) {
        System.out.println("單參數");
    }

}

結果
在這裏插入圖片描述

爲什麼不定參數是語法糖

示例代碼

去掉了System.out.println代碼,防止干擾字節碼分析

public class Test1 {
    public static void main(String[] args) {
        print("大少", "二少");
        String[] names = {"大少", "二少"};
        printArray(names);
        print("大少 ");
    }

    public static void print(String... names) {
    }

    public static void printArray(String[] names) {
    }

    public static void print(String name) {
    }
}

使用IDEA默認安裝的插件Show Bytecode查看字節碼

public class com/csdn/sugar/Test1 {

  // compiled from: Test1.java


  public <init>()V
   L0
    LINENUMBER 3 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lcom/csdn/sugar/Test1; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1


  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 5 L0
    ICONST_2
    ANEWARRAY java/lang/String
    DUP
    ICONST_0
    LDC "\u5927\u5c11"
    AASTORE
    DUP
    ICONST_1
    LDC "\u4e8c\u5c11"
    AASTORE
    INVOKESTATIC com/csdn/sugar/Test1.print ([Ljava/lang/String;)V
   L1
    LINENUMBER 6 L1
    ICONST_2
    ANEWARRAY java/lang/String
    DUP
    ICONST_0
    LDC "\u5927\u5c11"
    AASTORE
    DUP
    ICONST_1
    LDC "\u4e8c\u5c11"
    AASTORE
    ASTORE 1
   L2
    LINENUMBER 7 L2
    ALOAD 1
    INVOKESTATIC com/csdn/sugar/Test1.printArray ([Ljava/lang/String;)V
   L3
    LINENUMBER 8 L3
    LDC "\u5927\u5c11 "
    INVOKESTATIC com/csdn/sugar/Test1.print (Ljava/lang/String;)V
   L4
    LINENUMBER 9 L4
    RETURN
   L5
    LOCALVARIABLE args [Ljava/lang/String; L0 L5 0
    LOCALVARIABLE names [Ljava/lang/String; L2 L5 1
    MAXSTACK = 4
    MAXLOCALS = 2


  public static varargs print([Ljava/lang/String;)V
   L0
    LINENUMBER 12 L0
    RETURN
   L1
    LOCALVARIABLE names [Ljava/lang/String; L0 L1 0
    MAXSTACK = 0
    MAXLOCALS = 1


  public static printArray([Ljava/lang/String;)V
   L0
    LINENUMBER 15 L0
    RETURN
   L1
    LOCALVARIABLE names [Ljava/lang/String; L0 L1 0
    MAXSTACK = 0
    MAXLOCALS = 1


  public static print(Ljava/lang/String;)V
   L0
    LINENUMBER 18 L0
    RETURN
   L1
    LOCALVARIABLE name Ljava/lang/String; L0 L1 0
    MAXSTACK = 0
    MAXLOCALS = 1
}

  • 字節碼說明
    1.print(“大少”, “二少”);對應LINENUMBER 5,實際是創建一個數組,把大少,二少放入數組。
    2.public static void print(String… names)對應的public static varargs print([Ljava/lang/String;)V字節碼和方法 public static void printArray(String[] names) 的字節碼幾乎一致,只是多了varargs 標記是不定參數。所以確定Java把可變參數當做數組處理,可變參數只是使用了語法糖。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章