然而,使用可變參數(shù)時(shí),要注意幾個(gè)問題:
1) 可變參數(shù)方法與數(shù)組參數(shù)方法重載時(shí)
public class MethodParams{ //帶可變參數(shù)的方法 public void hello(String ...params) { System.out.println("執(zhí)行帶可變參數(shù)的方法,參數(shù)個(gè)數(shù)為:" + params.length); } //帶數(shù)組參數(shù)的方法 public void hello(String[] params) { System.out.println("執(zhí)行帶數(shù)組參數(shù)的方法,數(shù)組長度為:" + params.length); } }
我們寫個(gè)測試代碼運(yùn)行一下看看結(jié)果如何:
MethodParams mp = new MethodParams(); mp.hello("AAA","BBB","CCC");
編譯時(shí)報(bào)錯:
MethodParams.java:7: 無法在 MethodParams 中同時(shí)聲明 hello(java.lang.String[]) 和 hello(java.lang.String...) public void hello(String[] params) { ^ 1 錯誤
結(jié)論: JDK不允許存在, 帶可變參數(shù)的方法和帶數(shù)組參數(shù)的方法在同一類中重載。
可變參數(shù)==數(shù)組參數(shù)? 在帶可變參數(shù)的方法體時(shí),讀取可變參數(shù)列表時(shí),就是以數(shù)組的方式來讀取;
帶可變參數(shù)的方法可以傳入一個(gè)數(shù)組參數(shù),但帶數(shù)組參數(shù)的方法卻不能傳入可變參數(shù)。
2) 可變參數(shù)方法與可變參數(shù)方法重載時(shí)
//帶可變參數(shù)的方法 public void hello(String ...params) { System.out.println("執(zhí)行帶可變參數(shù)的方法,參數(shù)個(gè)數(shù)為:" + params.length); } //帶固定參數(shù)和可變參數(shù) public void hello(String param1, String ...params) { System.out.println("執(zhí)行帶固定參數(shù)和可變參數(shù)的方法,參數(shù)個(gè)數(shù)為:" + params.length); }
測試代碼跟上例中一樣,編譯時(shí)報(bào)錯:
MethodParams.java:18: 對 hello 的引用不明確,MethodParams 中的 方法 hello(java.l ang.String...) 和 MethodParams 中的 方法 hello(java.lang.String,java.lang.String ...) 都匹配 mp.hello("AAA","BBB","CCC"); ^ 1 錯誤
結(jié)論:JDK不允許存在,帶相同參數(shù)類型列表(Type List)的參數(shù)列表的方法在同一類中重載。
3)可變參數(shù)方法與無參數(shù)方法重載時(shí)
//帶可變參數(shù)的方法 public void hello(String ...params) { System.out.println("執(zhí)行帶可變參數(shù)的方法,參數(shù)個(gè)數(shù)為:" + params.length); } //不帶參數(shù)的方法 public void hello() { System.out.println("執(zhí)行不帶參數(shù)的方法"); }
我們都知道,可變參數(shù)即可帶0個(gè)或者多個(gè)參數(shù),如果帶0個(gè)參數(shù)即不帶參數(shù)時(shí),JDK會怎么處理呢?
那我們就以執(zhí)行"mp.hello()"來測試一下。編譯通過,運(yùn)行正常,調(diào)用的還帶參數(shù)的hello()方法。
結(jié)論:當(dāng)可變參數(shù)方法與不帶參數(shù)的方法重載時(shí),JDK默認(rèn)調(diào)用的是無參數(shù)的方法。若類中沒有定義無參數(shù)的方法,則會調(diào)用可變參數(shù)的方法。
提供給外部調(diào)用的cn.idchecker.check.Checker類的相關(guān)方法如下表:
方法 | 方法作用 | 參數(shù)及返回值 |
Checker(String num) | 構(gòu)造方法 | 參數(shù)num為18位身份證號碼的字符串 |
boolean checkLength() | 驗(yàn)證身份證長度是否正確 | 長度為18,則返回true,否則返回false |
boolean checkBirth() | 驗(yàn)證出生生日碼是否合法 | 合法則返回true,否則返回false |
boolean checkAddr() | 驗(yàn)證地址碼是否存在 | 存在則返回true,否則返回false |
boolean checkCheckCode() | 計(jì)算校驗(yàn)碼是否正確 | 正確則返回true,否則返回false |
boolean check() | 總的身份證驗(yàn)證,驗(yàn)證順序:長度 -> 生日 -> 最后一位校驗(yàn)碼 -> 地址 | 若遇到有一項(xiàng)目不合法即返回false,所有驗(yàn)證通過才返回true。驗(yàn)證后,可通過調(diào)用getErrorMsg()方法獲取錯誤信息 |
boolean checkAll() | 總的身份證驗(yàn)證,驗(yàn)證項(xiàng)目包括長度、地址、生日、最后一位校驗(yàn)碼 | 身份證合法則返回true,否則false。驗(yàn)證后,可調(diào)用getErrorMsgs()方法獲取錯誤信息集合 |
String getBirth() | 獲取出生年月日 | 返回“2010年01月12日”格式的生日字符串通串 |
String getAddr() | 獲取公民籍貫 | 返回籍貫字符串("xx省xx市xx縣”) |
String getSex() | 獲取性別 | 返回“男”或“女” |
String getErrorMsg() | 獲取錯誤信息 | 返回錯誤信息字符串 |
public Set<String> getErrorMsgs() | 獲取錯誤信息集合 | 返回錯誤信息集合 |
用法舉例 1 :解壓縮“idchecker.zip”,將其目錄下的“idchecker.jar” 包引進(jìn)Java Project中,以下是測試程序:
運(yùn)行結(jié)果:
用法舉例 2 :將“idchecker.jar” 包引進(jìn)到Web Project的lib目錄下,以下是測試程序:
運(yùn)行結(jié)果: