找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3077|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

簡(jiǎn)單介紹Java的不定長(zhǎng)度參數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:109770 發(fā)表于 2016-3-22 19:51 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
先看兩個(gè)簡(jiǎn)單的例子,來(lái)感受一下Java的不定長(zhǎng)度參數(shù)
第一個(gè)例子:
Java代碼  收藏代碼

    public class VariArgs {  

        public static void main(String[] args) {  
            test();  
            test("aaa");  
            test("aaa", "bbb");  
            test("aaa", "bbb", "ccc");  
        }  

        public static void test(String... args) {  
            System.out.println(args.getClass());  
            for (String arg : args) {  
                System.out.println(arg);  
            }  
        }  
    }  


第二個(gè)例子:
Java代碼  收藏代碼

    public class VariArgs {  

        public static void main(String[] args) {  
            test("aaa");  
            test("aaa", "bbb");  
            test("aaa", "bbb", "ccc");  
        }  

        public static void test(String arg, String... args) {  
            System.out.println(arg);  
            System.out.println("----------------");  
            for (String s : args) {  
                System.out.println(s);  
            }  
        }  
    }  


   讀者可以自己運(yùn)行一下,這個(gè)不定長(zhǎng)度參數(shù)的類型為String[],即字符串?dāng)?shù)組。
從上面可以看出,如果一個(gè)方法的參數(shù)定為不定參數(shù)的話,這個(gè)參數(shù)可以根據(jù)參數(shù)個(gè)數(shù)動(dòng)態(tài)生成一個(gè)數(shù)組,然后傳入方法執(zhí)行。
    不過(guò),不定參數(shù)有兩個(gè)規(guī)定:第一,方法的參數(shù)列表中最多只有一個(gè)不定長(zhǎng)度的參數(shù);第二,就是不定長(zhǎng)度的數(shù)組的位置必須是最后一個(gè)參數(shù)。不然不能通過(guò)編譯。
    對(duì)于第一個(gè)規(guī)定,是因?yàn)槿绻卸嘤谝粋(gè)不定長(zhǎng)度的參數(shù),當(dāng)真正調(diào)用這個(gè)方法的時(shí)候,JVM、將不知道前面的不定長(zhǎng)度參數(shù)有多長(zhǎng), 下一個(gè)參數(shù)是從哪里開(kāi)始.
    對(duì)于第二個(gè)參數(shù)也是一樣,編譯器不知道不定長(zhǎng)度參數(shù)的長(zhǎng)度,無(wú)法確定從哪里開(kāi)始下一個(gè)參數(shù)。
    以下是幾種不正確使用不定長(zhǎng)度參數(shù)的例子,請(qǐng)不要這樣寫程序:
Java代碼  收藏代碼

    public static void test(Object... objs, Object obj);  

    public static void test(Object obj1, Object... objs, Object obj2);  

    public static void test(Object... objs1, Object... objs2);  


   不定參數(shù)的方法可以重載。(大家都知道,重載就是方法名相同,而方法的參數(shù)列表不同)
   下面給出重載的示例:
Java代碼  收藏代碼

    public class VariArgs {  

        public static void main(String[] args) {  
            test("aaa");  
            test("aaa", "bbb");  
            test("aaa", "bbb", "ccc");  
        }  

        public static void test(Object... args) {  
        }  

        public static void test(String arg, String... args) {  
        }  
    }  


   讀者如果細(xì)心的話,可以看出文章開(kāi)頭給出的兩個(gè)例子的區(qū)別,就是第二個(gè)例子比第一個(gè)例子的test方法的參數(shù)多出了一個(gè)String arg,從感覺(jué)上沒(méi)有太大的區(qū)別,這有點(diǎn)像編譯原理的*和+的區(qū)別。第一個(gè)test方法指可以有0或N個(gè)String做參數(shù),但第二個(gè)test方法指至少一個(gè)String做為參數(shù)。
   然后結(jié)合重載來(lái)看,把第一個(gè)例子和第二個(gè)例子合并成一個(gè)類,得到以下代碼:
Java代碼  收藏代碼

    public class VariArgs {  

        public static void main(String[] args) {  
            test();  
            test("aaa");  
            test("aaa", "bbb");  
            test("aaa", "bbb", "ccc");  
        }  

        public static void test(String... args) {  
            System.out.println(args.getClass());  
            for (String arg : args) {  
                System.out.println(arg);  
            }  
        }  

        public static void test(String arg, String... args) {  
            System.out.println(arg);  
            System.out.println("----------------");  
            for (String s : args) {  
                System.out.println(s);  
            }  
        }  
    }  


    讀者可以編譯下這個(gè)程序,結(jié)果是編譯不通過(guò)。為什么呢?程序編譯到第五行時(shí),不能確定test("aaa")該用第10行的test方法還是第17行的方法,因?yàn)閮蓚(gè)方法都可以有相同的參數(shù)列表。都能精確匹配上參數(shù)列表,編譯器在這種情況下只好報(bào)出編譯不能通過(guò)的錯(cuò)誤。所以在重載這樣的方法時(shí),注意參數(shù)列表,不要使兩個(gè)方法可以有同樣的參數(shù)列表。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表