每天一分鐘來一顆Java語法糖(三)不定項參數
每天一分鐘來一顆Java語法糖-不定項參數
不定項參數引入版本
- Java1.5增加了新特性:可變參數
不定項參數介紹
不定項參數:適用於參數個數不確定,類型確定的情況,Java把可變參數當做數組處理。
不定項參數注意事項:
- 不定項參數必須放在參數列表最後一個。
- 不定項參數只能有一個(多個,必然有一個不是最後一個)。
- 重載時,運行優先級問題(確定參數的方法優先級高於不定項參數的方法)。
不定項參數演示
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把可變參數當做數組處理,可變參數只是使用了語法糖。