1. 程式人生 > >Java可變引數方法過載時要注意的幾個問題

Java可變引數方法過載時要注意的幾個問題

轉載自:http://www.blogjava.net/rongxh7/archive/2010/04/18/318698.html

JDK1.5引進了方法的可變引數,受到許多開發人員的青睞。有了這種機制,我們可以寫出類似於JavaScript的arguments那樣的帶任意多個引數的方法。Java的可變引數,可用於普通方法上,也可以用於構造方法上,大大增大了我們所寫方法的適用範圍。


然而,使用可變引數時,要注意幾個問題:

1) 可變引數方法與陣列引數方法過載時

public class MethodParams{
//帶可變引數的方法
public void hello(String ...params) {
System.out.println("執行帶可變引數的方法,引數個數為:" + params.length);
}
//帶陣列引數的方法
public void hello(String[] params) {
System.out.println("執行帶陣列引數的方法,陣列長度為:" + params.length);
}
}

我們寫個測試程式碼執行一下看看結果如何:

	MethodParams mp = new MethodParams();
mp.hello("AAA","BBB","CCC");

  編譯時報錯:

MethodParams.java:7: 無法在 MethodParams 中同時宣告 hello(java.lang.String[]) 和
hello(java.lang.String...)
public void hello(String[] params) {
^
1 錯誤

結論: JDK不允許存在, 帶可變引數的方法和帶陣列引數的方法在同一類中過載。

可變引數==陣列引數? 在帶可變引數的方法體時,讀取可變引數列表時,就是以陣列的方式來讀取;

帶可變引數的方法可以傳入一個數組引數,但帶陣列引數的方法卻不能傳入可變引數。

2) 可變引數方法與可變引數方法過載時

	//帶可變引數的方法
public void hello(String ...params) {
System.out.println("執行帶可變引數的方法,引數個數為:" + params.length);
}
//帶固定引數和可變引數
public void hello(String param1, String ...params) {
System.out.println("執行帶固定引數和可變引數的方法,引數個數為:" + params.length);
}

  測試程式碼跟上例中一樣,編譯時報錯:

MethodParams.java:18: 對 hello 的引用不明確,MethodParams 中的 方法 hello(java.l
ang.String...) 和 MethodParams 中的 方法 hello(java.lang.String,java.lang.String
...) 都匹配
mp.hello("AAA","BBB","CCC");
^
1 錯誤

 結論:JDK不允許存在,帶相同引數型別列表(Type List)的引數列表的方法在同一類中過載。

3)可變引數方法與無引數方法過載時

	//帶可變引數的方法
public void hello(String ...params) {
System.out.println("執行帶可變引數的方法,引數個數為:" + params.length);
}
//不帶引數的方法
public void hello() {
System.out.println("執行不帶引數的方法");
}

我們都知道,可變引數即可帶0個或者多個引數,如果帶0個引數即不帶引數時,JDK會怎麼處理呢?

那我們就以執行"mp.hello()"來測試一下。編譯通過,執行正常,呼叫的還帶引數的hello()方法。

結論:當可變引數方法與不帶引數的方法過載時,JDK預設呼叫的是無引數的方法。若類中沒有定義無引數的方法,則會呼叫可變引數的方法。

最後想補充一下自己的觀點:感覺Java對可變引數的處理並不智慧 也不是很合理 它完全可以這樣處理:固定引數(包括引數個數 型別等 當然也包括陣列)的級別要高於可變引數 如果嚴格按照這個原則來處理的話 是可以避免上述這些問題的  第一個問題:陣列的級別高於可變引數  所以不存在該問題 第二個問題 固定引數的級別高於可變引數 所以也不會出現那個問題  第三個:我覺得此事JVM似乎認識到了可變引數的級別沒有固定引數(無參也是固定引數)高了!! 所以第三個沒有出現問題  因此總結:將固定引數的級別設為高於可變引數的級別的話 Java對可變引數的處理將會更好  個人觀點 不同請議論

相關推薦

Java可變引數方法過載注意問題

轉載自:http://www.blogjava.net/rongxh7/archive/2010/04/18/318698.html JDK1.5引進了方法的可變引數,受到許多開發人員的青睞。有了這種機制,我們可以寫出類似於JavaScript的arguments那樣的

java學習筆記---Java可變引數方法過載注意問題

JDK1.5引進了方法的可變引數,受到許多開發人員的青睞。有了這種機制,我們可以寫出類似於JavaScript的arguments那樣的帶任意多個引數的方法。Java的可變引數,可用於普通方法上,也可以用於構造方法上,大大增大了我們所寫方法的適用範圍。 然而,使用可變

Java可變引數(...)方法過載注意問題

JDK1.5引進了方法的可變引數,受到許多開發人員的青睞。有了這種機制,我們可以寫出類似於JavaScript的arguments那樣的帶任意多個引數的方法。Java的可變引數,可用於普通方法上,也可以用於構造方法上,大大增大了我們所寫方法的適用範圍。 然而

JAVA使用並行流(ParallelStream)注意的一些問題

List<String> words = new ArrayList<String>(); words.add("your"); words.add("name"); public static Stream<Character> character

MySQL 中處理 Null 注意陷阱

MySQL資料庫是一個基於結構化資料的開源資料庫。SQL語句是MySQL資料庫中核心語言。不過在MySQL資料庫中執行SQL語句,需要小心兩個陷阱。 陷阱一:空值不一定為空 空值是一個比較特殊的欄位。在MySQL資料庫中,在不同的情形下,空值往往代表不同的含義。這是M

Linux儲存之安裝區?如何規劃分割槽?不同的分割槽有什麼含義?

文章目錄 1. 掛載點主要有 / 、 swap 、 /home 等,它們都有什麼具體的含義呢? 2.幾種基本的劃分 2.1 對初次接觸的新手或硬碟空間有限Desktop的安裝建議: 2.2 對高階Desktop使用者的安裝

購買深圳簡訊平臺選擇簡訊公司注意重點

簡訊平臺營銷作為一種價效比很高的營銷方式,被廣闊中小企業所喜愛,做好簡訊營銷的關鍵是要選擇一個正軌的簡訊平臺平臺,那麼如何選擇到一個正軌的簡訊平臺平臺呢?這四點不得不知,下面樂信小編就為大家細緻引見一下。   一、抵達率高、傳送速度快   抵達率高是做好簡訊營銷的關鍵,假如傳送的簡訊客戶收不到,那麼後面的

關於錢包:我們注意問題—MGCEX

  一:私鑰決定了你所擁有數字貨幣的產權。只有你才能使用你的數字貨幣。  二:私鑰不能忘也不能丟。忘了就只能眼睜睜看到幣在那裡卻動不了,丟了你的幣就白白送人了。  三:公鑰是公開的,地址也是公開的。任何人把幣轉入你的地址裡,就只有擁有對應私鑰的人,也就是我們自己才能動轉進來的

Java中不使用陣列,傳入多可變引數

JDK1.5之後   Public static void main(String[] args) { Demo(); Demo(1,2,3); } public void Demo(int a,int b,int...array)//放最後,只能一個 {

MyBatis中只傳一個String引數注意的事項

引數名為_parameter,不需要指定成傳入的引數名,參考程式碼如下: <select id="getLoop" resultMap="AAA" parameterType="String"> SELECT *, ROWNUM RN from tablename

Java可變引數個數方法

/* *JDK5.0新特性:可變個數形式引數 * * 1.可匹配0至多個引數 * 2.可與其他同名方法構成過載 * 3.與陣列的使用方法一直,只是多了“沒有引數” * 4.若要加入其它型別

Java筆記】方法過載與重寫的區別

1.重寫(Override) 重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫! 重寫的好處在於子類可以根據需要,定義特定於自己的行為。 也就是說子類能夠根據需要實現父類的方法。 重寫方法不能丟擲新的檢查異常或者比被重寫方法申明更加寬

Java基礎之方法過載(Overload)

同一個類中的多個方法可以有相同的方法名稱,但是有不同的引數列表,這就稱為方法過載(method overloading)。 過載(overloading) 是在一個類裡面,方法名字相同,而引數不同。返回型別可以相同也可以不同。 每個過載的方法(或者建構函式)都必須有一個獨一無二的引數型別

Location許可權,因系統版本不同,6.0許可權對話方塊沒有,7.0,8.0正常,開發注意

1、一個獲取Location許可權引發的刺激,就這三個Location許可權 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission an

Java面向物件----方法過載

方法過載(over load):方法名相同,引數列表不同,返回型別無關 package com.tanlei.newer; public class OverLoadDemo { public static void main(String[] args) { Printer printe

java 可變引數,集合與陣列的互轉,靜態匯入

可變引數 可變引數是如果型別確定,引數個數不確定,需要用可變引數來定義,引數的具體個數在方法呼叫時才能確定java把可變引數當做陣列處理 可變引數的定義是jdk1.5加入的,比如main方法 public static void main(String [] args) 特點:

Java基礎之方法過載與構造方法

Java中方法的過載與構造方法 1. 方法的過載 過載是指在同一個類內具有相同名稱的多個方法,這些同名方法如果引數個數不同,或者引數個數相同,但型別不同,則這些同名的方法就具有不同的功能。 注意:方法的過載中引數的型別是關鍵,僅僅是引數的變數名不同是不行的。也就是說,引數的列表必須不

Java可變引數的使用

Java相關知識 基本資料型別(八個):byte , short , int , long , float,double,boolean,char, 基本資料型別 .length() 不是基本資料型別 .length 可變引數的使用 public

Java可變引數型別與陣列的區別聯絡

Java方法中的可變引數型別是一個非常重要的概念,有著非常廣泛的應用,本文對此加以分析。如下:  public class TestVarArgus { public static void dealArray(int... intArray) { }

簡豪全鋁家居在選擇品牌注意哪些問題

在完成了家庭裝修以後,需要選擇合適的傢俱產品,才可以在居住時,覺得舒適程度非常的高。各種型別的家居產品越來越多,在挑選的時候是需要注意很多方面的問題。越來越多的使用者對簡豪全鋁家居會非常的喜歡,環保級別很高,有很多的款式可以提供給使用者來進行選擇。市場當中也有很