[Java] 4.6. 可變個數的參數

無論在方法上輸入多少值,可變個數的參數都可以幫你收到一個參數中。

 

image/svg+xml4.6 可變參數 - Variable Arguments class Person { String id; String name; int age; void setSkills ( String skill1 , String skill2 , String skill3 ) { System.out.println( " 我會的技能有: " ); System.out.println(skill1); System.out.println(skill2); System.out.println(skill3); } } class Main{ public static void main( String [] args){ Person p = new Person(); p. setSkills ( " 唱歌 " , " 跳舞 " , " 游泳 " , " 寫書法 " ); } } class Person { String id; String name; int age; String [] skills ; void setSkills ( String ... ss ) { skills = ss ; } void show (){ System.out.println( " 我的⾝份證字號是 " + id); System.out.println( " 我的姓名是 " +name); System.out.println( " 我的年齡是 " +age); System.out.print( 我會的技能有: " ); for ( String s : skills ) System.out.print( s + " " ); System.out.println(); } } class Main{ public static void main( String [] args){ Person p1 = new Person (); p1.id= "k123456789" ; p1.name= "Jack" ; p1.age= 20 ; p1 . setSkills ( " 唱歌 " , " 跳舞 " , " 游泳 " , " 寫書法 " ); p1.show(); Person p2= new Person(); p2.id= "J000111222" ; p2.name= "Mary" ; p2.age= 18 ; p2. setSkills ( " 爬⼭ " ); p2.show(); } } 執⾏結果 我的⾝份證字號是 k123456789 我的姓名是 Jack 我的年齡是 20 我會的技能有:唱歌 跳舞 游泳 寫書法 我的⾝份證字號是 J000111222 我的姓名是 Mary 我的年齡是 18 我會的技能有:爬⼭ class Person{ String id; String name; int age; void setSkills ( String ... ss1 , String ... ss2 ) { } } 編譯時發⽣錯誤 Person.java:5: error: ')' expected void setSkills (String... ss1, String... ss2 ) { } ^ Person.java:5: error: <identifier> expected void setSkills (String... ss1, String... ss2 ) { } ^ Person.java:5: error: <identifier> expected void setSkills (String... ss1, String... ss2 ) { } ^ 3 errors class Person{ String id; String name; int age; void setSkills ( String ... ss , String bestSkill) { } } 編譯時發⽣錯誤 Person.java:5: error: ')' expected void setSkills (String... ss, String bestSkill) { } ^ Person.java:5: error: ';' expected void setSkills (String... ss, String bestSkill) { } ^ 2 errors J4_6_1 – Person.java 1. 這是⼈員類別( Person )。 J4_6_2 – Person.java 1. 這是⼈員類別( Person ),其中有個設定技能⽅法 setSkills() ),可以⽤來設定⼈員的技能。 2. ⽬前的設定技能⽅法,只有 3 個參數可以⽤來接放技能,若是 有⼀個⼈員有 4 個技能呢?以⽬前的程式來看,編譯是不會成功的, 編譯器會告訴我們在此沒有 4 個參數設定技能⽅法,這時怎麼辦呢? J4_6_1 – Main.java 2. 這是非必要的,只是等會會使⽤到,所以先宣告 ⼀個可以接放字串陣列的變數。變數的名稱 skills 說明了等會這個變數將會存放裝載技能的陣列。 3. 這是設定技能⽅法 setSkills() )。 4. 只要在參數的型別與變數名稱之間加上 “…” ,表⽰這個 參數將會是⼀個可變參數,可接收不同個數的參數。 5. 透過可變參數接收到的其實是⼀個陣列物件(編譯器會另外產⽣程式,動態 的建立陣列,並決定陣列的空間⼤⼩),現在我們將這個陣列物件存⾄技能 skills )屬性中,同時也證明可變參數接收到的是⼀個陣列物件。 6. 於⾃我介紹⽅法中( show() ),透過 for 依序的 將技能屬性( skills )中的每個技能列⽰出來。 J4_6_2 – Main.java 1. 建立⼈員物件( Person )。 2. 因為設定技能⽅法( setSkills() )以⼀個可變參數來接收所有的技能,因此只要使⽤ 逗號即可以將資料分隔。若想多輸入⼀項技能時,只要使⽤逗號即可多輸入⼀項技能。 3. 當然,您也可以只輸入⼀項技能。 可變參數中的 “…” 基本上只需位於參數型別與參數之間即可,並不需在意 “…” 需要與參數型別或是參數相連,如: “String … ss” “String …ss” 皆是可被接受的語法。 J4_6_3 – Person.java J4_6_4 – Person.java 1. 有兩個可變參數時,編譯會產⽣⼀些不相⼲的 錯誤。原因是編譯器會把可變參數視為是最後⼀個 參數,因此造成後⾯的語法解析錯誤無法分析。 2. 同樣的,編譯器會將可變參數視為最後⼀個 參數,這也造成了若後⾯還有參數,則編譯器會 無法辨識此參數,造成語法上的解析失敗。 1 步,可變參數,製作變動個數的技能參數 2 步,給予可變參數隨意個數的技能 每個⼈會的技能是不⼀樣的, ⽽且技能的個數也會因⼈⽽異, 這時候如何動態的設定技能呢 ?! 1 2 1 2 但⼩⼼ ⼀個⽅法最多只可擁有⼀個可變參數,且可變參數 必須放在最後⼀個參數位置 1 1 1 1

留言