Java數(shù)組傳遞及可變參數(shù)操作實(shí)例詳解
本文實(shí)例講述了Java數(shù)組傳遞及可變參數(shù)操作。分享給大家供大家參考,具體如下:
方法可以操作傳遞和返回基本數(shù)據(jù)類(lèi)型,但是方法中也可用來(lái)傳遞和返回?cái)?shù)組。如果要向方法中傳遞一個(gè)數(shù)組,則方法的接收參數(shù)處必須是符合其類(lèi)型的數(shù)組。而且數(shù)組屬于引用數(shù)據(jù)類(lèi)型,所以在把數(shù)組傳遞進(jìn)方法之后,如果方法對(duì)數(shù)組本身做了任何修改,修改結(jié)果都是會(huì)保存下來(lái)的。
向方法中傳遞數(shù)組
在java中,所有對(duì)象都是通過(guò)引用進(jìn)行操作的。而數(shù)組也是一種對(duì)象,當(dāng)把數(shù)組作為參數(shù)傳遞給方法時(shí),傳遞的實(shí)際上就是數(shù)組對(duì)象的引用。在方法中對(duì)數(shù)組的所有操作,都會(huì)映射到原數(shù)組中。而所謂的"引用",就是java對(duì)象在堆內(nèi)存的地址賦給了多個(gè)"棧內(nèi)存"的變量。
public class Test {
public static void main(String[] args) {
int[] array = { 1, 3, 5 }; // 使用靜態(tài)初始化定義數(shù)組
method(array); // 傳遞數(shù)組引用
for (int i = 0; i < array.length; i++) { // 循環(huán)輸出
System.out.print(array[i] + "\t");
}
}
public static void method(int[] x) { // 接收整型數(shù)組引用
x[0] = 6; // 修改第一個(gè)元素的內(nèi)容
}
}
執(zhí)行結(jié)果:
6 3 5
我們來(lái)看一下其執(zhí)行時(shí)的內(nèi)存狀態(tài):

使用方法返回一個(gè)數(shù)組
既然方法可以接收一個(gè)數(shù)組,那么方法也就可以返回一個(gè)數(shù)組,則此時(shí),只需要在返回值類(lèi)型聲明處明確的寫(xiě)出返回的數(shù)組類(lèi)型即可。
public class Test {
public static void main(String[] args) {
int[] array = method(); // 通過(guò)方法實(shí)例化數(shù)組
print(array); // 向print()方法中傳遞數(shù)組
}
public static void print(int x[]) { // 接收數(shù)組
for (int i = 0; i < x.length; i++) { // 循環(huán)輸出
System.out.print(x[i] + "");
}
}
public static int[] method() { // 此方法返回一個(gè)數(shù)組引用
int ss[] = { 1, 3, 5, 7, 9 }; // 定義一個(gè)數(shù)組
return ss; // 返回?cái)?shù)組
}
}
執(zhí)行結(jié)果:
1 3 5 7 9
可變參數(shù)(JDK 1.5)
JDK 1.5 開(kāi)始,Java支持傳遞同類(lèi)型的可變參數(shù)給一個(gè)方法。一個(gè)方法中只能指定一個(gè)可變參數(shù),它必須是方法的最后一個(gè)參數(shù)。任何普通的參數(shù)必須在它之前聲明。
聲明方式:
返回值類(lèi)型 方法名稱(chēng)(類(lèi)型…參數(shù)名稱(chēng)){ // 在方法聲明中,在指定參數(shù)類(lèi)型后加一個(gè)省略號(hào)(...)
// 方法體
}
可變參數(shù)方法的使用與方法參數(shù)部分使用數(shù)組是一致的,例如可以循環(huán)輸出所有的參數(shù)值。
public static void print(String...names) { // 接收數(shù)組
for(String name : names) {
System.out.print(name + " ");
}
System.out.println();
}
調(diào)用的時(shí)候可以給出任意多個(gè)參數(shù)也可不給參數(shù),例如:
public static void main(String[] args) {
String[] names = {"jerry", "tom", "rose"};
print(); // 不傳遞參數(shù)
print("jerry", "tom"); // 傳遞多個(gè)參數(shù)
print(names); // 傳遞數(shù)組
}
從以上代碼可知,調(diào)用使用了可變參數(shù)的方法時(shí):
1)可以不寫(xiě)參數(shù),即傳入空參;
2)可以直接在里邊寫(xiě)入?yún)?shù),參數(shù)間用逗號(hào)隔開(kāi);
3)可以傳入一個(gè)數(shù)組;
可變參數(shù)的使用規(guī)則
1) 擁有可變參數(shù)的方法可以被重載,在調(diào)用方法的時(shí)候,如果能夠和固定參數(shù)的方法匹配,也能夠與可變長(zhǎng)參數(shù)的方法匹配,則選擇固定參數(shù)的方法。
public class Test {
public static void main(String[] args) {
print();
print("jerry");
print("jerry", "tom");
}
public static void print(String...names) { // 接收數(shù)組
System.out.print("可變參數(shù)方法: ");
for(String name : names) {
System.out.print(name + " ");
}
System.out.print("\n");
}
public static void print(String name) { // 接收一個(gè)String類(lèi)型參數(shù)
System.out.println("固定參數(shù)方法: " + name);
}
}
執(zhí)行結(jié)果如下:
可變參數(shù)方法: 固定參數(shù)方法: jerry 可變參數(shù)方法: jerry tom
2)如果要調(diào)用的方法可以和兩個(gè)可變參數(shù)匹配,則出現(xiàn)錯(cuò)誤。
public class Test {
public static void main(String[] args) {
print();
print("jerry"); // 編譯錯(cuò)誤
print("jerry", "tom"); // 編譯錯(cuò)誤
}
public static void print(String...names) {
System.out.println("------1------");
}
public static void print(String name, String...names) {
System.out.println("------2------ ");
}
}
main方法中的兩個(gè)傳參的調(diào)用都不能編譯通過(guò),因?yàn)榫幾g器不知道該選哪個(gè)方法調(diào)用,如下所示:

3)一個(gè)方法只能有一個(gè)可變長(zhǎng)參數(shù),并且這個(gè)可變長(zhǎng)參數(shù)必須是該方法的最后一個(gè)參數(shù)
public class Test {
public static void print(String name, String...names) {
System.out.println("------1------");
}
public static void print(int[] Ids, String...names) {
System.out.println("------2------ ");
}
}
以下的方法定義都是錯(cuò)誤的:

4)可變參數(shù)可以兼容數(shù)組參數(shù),但數(shù)組參數(shù)無(wú)法兼容可變參數(shù)。
public class Test {
public static void main(String[] args) {
}
public void print(String... names){
System.out.println("-----1-----");
}
public void print(String[] names){
System.out.println("-----2-----");
}
}
當(dāng)試圖使用數(shù)組作為參數(shù)去實(shí)現(xiàn)重載時(shí),會(huì)報(bào)錯(cuò),說(shuō)明可變參數(shù)與數(shù)組沖突(兩者應(yīng)該是一方能兼容另一方)。

public class Test {
public static void main(String[] args) {
Test test = new Test();
test.print("jerry","tom");
}
public void print(String[] namse){
System.out.println("----------");
}
}
如果定義一個(gè)參數(shù)為數(shù)組的方法,像調(diào)用可變參數(shù)的方法一樣調(diào)用它是會(huì)報(bào)錯(cuò),說(shuō)明可變參數(shù)并不是一個(gè)數(shù)組。

可變長(zhǎng)參數(shù)的使用規(guī)范
1) 避免帶有可變長(zhǎng)參數(shù)的方法重載
例如上面使用規(guī)則的第一個(gè)例子,編譯器雖然知道怎么調(diào)用,但人容易陷入調(diào)用的陷阱及誤區(qū)。
2) 別讓null值和空值威脅到變長(zhǎng)方法
public class Test {
public static void main(String[] args) {
print("人事部");
print("jerry", null);
}
public static void print(String dept, Integer...Ids) {
}
public static void print(String name, String...names ){
}
}
以上main方法里的兩個(gè)調(diào)用編譯都不通過(guò):

因?yàn)閮蓚€(gè)方法都匹配,編譯器不知道選哪個(gè),于是報(bào)錯(cuò)了,這里同時(shí)還有個(gè)非常不好的編碼習(xí)慣,即調(diào)用者隱藏了實(shí)參類(lèi)型,這是非常危險(xiǎn)的,不僅僅調(diào)用者需要“猜測(cè)”該調(diào)用哪個(gè)方法,而且被調(diào)用者也可能產(chǎn)生內(nèi)部邏輯混亂的情況。對(duì)于本例來(lái)說(shuō)應(yīng)該做如下修改:
public static void main(String[] args) {
String[] names = null;
print("jerry", names);
}
3)重寫(xiě)(覆寫(xiě))可變參數(shù)方法也要循規(guī)蹈矩
public class Test {
public static void main(String[] args) {
// 向上轉(zhuǎn)型
Base base = new Sub();
base.print("hello");
// 不轉(zhuǎn)型
Sub sub = new Sub();
sub.print("hello");
}
}
//基類(lèi)
class Base {
void print(String... args) {
System.out.println("Base......test");
}
}
//子類(lèi),覆寫(xiě)父類(lèi)方法
class Sub extends Base {
@Override
void print(String[] args) {
System.out.println("Sub......test");
}
}
以上main方法中第二個(gè)調(diào)用編譯不通過(guò):

第一個(gè)能編譯通過(guò),這是為什么呢?事實(shí)上,base對(duì)象把子類(lèi)對(duì)象sub做了向上轉(zhuǎn)型,形參列表是由父類(lèi)決定的,當(dāng)然能通過(guò)。再看看子類(lèi)直接調(diào)用的情況,這時(shí)編譯器看到子類(lèi)覆寫(xiě)了父類(lèi)的print方法,因此肯定使用子類(lèi)重新定義的print方法,盡管參數(shù)列表不匹配也不會(huì)跑到父類(lèi)再去匹配下,因?yàn)檎业搅司筒辉僬伊?,因此有了?lèi)型不匹配的錯(cuò)誤。
這是個(gè)特例,重寫(xiě)的方法參數(shù)列表與父類(lèi)不相同,這違背了重寫(xiě)的定義,并且會(huì)引發(fā)莫名其妙的錯(cuò)誤。在這里,我們?cè)購(gòu)?fù)習(xí)下重寫(xiě)必須滿(mǎn)足的條件:
1)重寫(xiě)方法不能縮小訪(fǎng)問(wèn)權(quán)限;
2)參數(shù)列表必須與被重寫(xiě)方法相同(包括顯示形式);
3)返回類(lèi)型必須與被重寫(xiě)方法的相同或是其子類(lèi);
4)重寫(xiě)方法不能拋出新的異常,或者超過(guò)了父類(lèi)范圍的異常,但是可以?huà)伋龈佟⒏邢薜漠惓?,或者不拋出異?!?/p>
最后,我們看下面一個(gè)有陷阱的例子:
public class Test {
public static void main(String[] args) {
print("");
print("jerry");
print("jerry", "tom");
}
public static void print(String name, String... names) {
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
}
}
以上代碼是能夠正常編譯執(zhí)行的,它的執(zhí)行結(jié)果如下:
tom
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- Java實(shí)現(xiàn)茶葉售賣(mài)商城系統(tǒng)(java+SSM+JSP+EasyUi+mysql)
- java easyUI實(shí)現(xiàn)自定義網(wǎng)格視圖實(shí)例代碼
- easyui簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java easyui樹(shù)形表格TreeGrid的實(shí)現(xiàn)代碼
- Java框架SSH結(jié)合Easyui控件實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng)示例解析
- Java如何接收前端easyui?datagrid傳遞的數(shù)組參數(shù)
相關(guān)文章
Java操作MongoDB模糊查詢(xún)和分頁(yè)查詢(xún)
這篇文章主要介紹了Java操作MongoDB模糊查詢(xún)和分頁(yè)查詢(xún)的相關(guān)資料,需要的朋友可以參考下2016-04-04
Java調(diào)用GPU算力的實(shí)現(xiàn)示例
本文主要介紹了Java調(diào)用GPU算力的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
eclipse導(dǎo)入工程報(bào)錯(cuò)問(wèn)題項(xiàng)目或者文件有紅叉的解決方案
這篇文章主要介紹了eclipse導(dǎo)入工程報(bào)錯(cuò)問(wèn)題項(xiàng)目或者文件有紅叉的解決方案,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Java排序之冒泡排序的實(shí)現(xiàn)與優(yōu)化
冒泡排序是一種簡(jiǎn)單的交換排序。之所以叫做冒泡排序,因?yàn)槲覀兛梢园衙總€(gè)元素當(dāng)成一個(gè)小氣泡,根據(jù)氣泡大小,一步一步移動(dòng)到隊(duì)伍的一端,最后形成一定對(duì)的順序。本文將利用Java實(shí)現(xiàn)冒泡排序,并進(jìn)行一定的優(yōu)化,希望對(duì)大家有所幫助2022-11-11
在Spring Boot中加載初始化數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了在Spring Boot中加載初始化數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Java中子類(lèi)調(diào)用父類(lèi)構(gòu)造方法的問(wèn)題分析
本篇文章介紹了,Java中子類(lèi)調(diào)用父類(lèi)構(gòu)造方法的問(wèn)題分析。需要的朋友參考下2013-04-04
字節(jié)碼調(diào)教入口JVM?寄生插件javaagent
這篇文章主要介紹了字節(jié)碼調(diào)教入口JVM?寄生插件javaagent方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用
這篇文章主要介紹了Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01

