⑴ java 可變參數是什麼
java 可變參數是1.5版本的新特性,也就是說用戶若是想定義一個方法,但是在此之前並不知道以後要用的時候想傳幾個參數進去,可以在方法的參數列表中寫參數類型或者數組名,然後在方法內部直接用操作數組的方式操作。
java可變長的形參聲明格式:dataType...parameters。
其中,省略號表示數據類型為dataType的parameters參數個數不固定的,可為任意個。此外,在方法調用時,變長形式參數可被替換成1個、2個或多個參數。在編譯時,方法的變長參數將被看成具有相同類型的一維數組。
在java語言開發中,從JDK1.5以後,java允許定義形參長度可變的參數從而允許為方法指定數量不確定的形參。
⑵ java中的可變參數
B項是不對的,不能有多個可變參數。。。。
可變參數只能有一個,而且只能是在形參的最後一個
⑶ java中可變參數int nums[] = {1,2,3,4};為什麼這樣寫是不對的,幫忙解釋下謝謝!
int nums[] = {1,2,3,4};的寫法是對。
首先你要明白「定義」本來就是一個籠統的概念,它可以是1.只聲明;2聲明並分配內存;3聲明,分配內存並初始化。
java中定義數據就那麼幾種方法:
一:只聲明一個數組,聲明一個數組不分配內存,所以[ ]中不需要有數字
type arrayName[];或者type[] arrayName;
二:聲明並分配內存,這時[ ]中必須有數字以顯示數組長度
arrayName=new type[arraySize];或者type arrayName=new type[arraySize];
三:聲明,分配內存並初始化,這時必須為數組顯式初始化(也就是填寫數組元素)
例如:int nums[] = {1,2,3,4};
PS:在(二:聲明並分配內存)中,其實系統會默認初始化,int數組默認數組元素都是0,String數組默認數組元素都是空格,布爾數組默認數組元素都是false等等。
比如:int arrayName[4];其實等同於int arrayName[]={0,0,0,0};
至於int nums[ ] 和int[ ] nums本質是沒什麼區別的,盡量寫成後者樣式比較合理。
這么說應該很好理解吧!o(╯□╰)o
⑷ 關於Java可變參數問題
你好,很高興回答你的問題。
這就是java可變參數的傳參方式,可以直接傳一個符合參數數據類型的數組,也可以是用逗號分割的多個符合參數數據類型變數。
如果有幫助到你,請點擊採納。
⑸ 關於Java多態以及可變形參的問題
首先,運行結果的確是sub。但不是因為「編譯器認為 int[] arr 和 int...arr 是一樣的」。而是因為:①可變參數最終會被編譯器以數組的方式存下來;然後調用的時候會優先匹配定長參數的方法,只有當定長參數的方法一個都匹配不上了,才去找非定長參數的方法;②你這個上轉型之後其實讓base這個實例擁有了兩個方法,一個是父類的不定長參數,一個是子類的定長參數方法;
傳參不報錯是因為判斷參數是否合法時匹配到了不定長參數那個方法;然後執行時優先匹配到了定長參數方法(可變參和數組存儲方式一致)。編譯器並不知道什麼可變不可變,就單純的按照規則去校驗調用;
對編譯器來說,方法名稱和參數列表組成了一個唯一鍵,稱為方法簽名,JVM 通過方法簽名決定調用哪種重載方法。
JVM 在重載方法中選擇合適方法的順序:
① 精確匹配。
② 基本數據類型自動轉換成更大表示範圍。
③ 自動拆箱與裝箱。
④ 子類向上轉型。
⑤ 可變參數。
你這個上轉型實現後,即實現了重寫,又實現了一種特殊的重載;而編譯器編譯時檢查參數合法性的時候檢查到了可變參的方法(你滑鼠挪到調用的地方你會看到,編譯器提示的你的方法是父類的可變參方法的,因為此時這個參數不是數組,是匹配不到定長參數的子類方法的);
然後編譯好具體執行的時候,編譯器哪還知道什麼定長不定長,就按照優先順序去調用方法,自然就把優先順序高的子類定長方法調用到了,不存在什麼動態綁定。
這里如果你把子類和父類的參數交換(子類是可變參數,父類是數組)那你的調用就報錯了,因為可變參兼容數組,但是數組卻不兼容可變參,這樣就只形成重寫而沒有重載,然後上轉型後就只能調用父類的方法了。就會報錯咯
⑹ 如何通過java 反射 調用一個 含有 可變參數的 方法呢
java反射調用可變參數的方法的方式是傳入objects參數,如下代碼:
publicclassReflect{
publicstaticvoidmain(String[]args)throwsException{
Class<?>clazz=Single.class;
Singlesingle=(Single)clazz.newInstance();
List<String>list=newArrayList<String>(){
=1L;
{
add("fuck");
add("ni");
add("mei");
}
};
//獲取method兩種方式,在method中數組的的空間大小是可以隨便寫的不一定使用0
/*1*/
Methodmethod=clazz.getDeclaredMethod("method",Array.newInstance(Object.class,0).getClass());
/*2*/
method=clazz.getDeclaredMethod("method",(newObject[0]).getClass());//初始化參數
/*1*/
Objectobjs=Array.newInstance(Object.class,2);
Array.set(objs,0,list);
Array.set(objs,1,"23");
method.invoke(single,objs);
/*2*/
Object[]objects={1,"fuck",list};
method.invoke(single,newObject[]{objects});
}
}
classSingle{
publicvoidmethod(Object...objs){
System.out.println(Arrays.deepToString(objs));
}
}
結果:
[[fuck,ni,mei],23]
[1,fuck,[fuck,ni,mei]]
⑺ java編程可變參數
將 int sum = 0; 改成 int sum = n1;
class Test{
public static void main(String[] args){
System.out.println(add(2));
System.out.println(add(2,3));
System.out.println(add(2,3,4));
}
public static int add(int n1,int... n){
int sum = n1;
for(int i=0;i<n.length;i++){
sum = sum+n[i];
}
return sum;
}
}
⑻ JAVA默認構造函數和可變參數構造函數之間的區別
構造函數
,是一種特殊的方法。主要用來在創建對象時初始化對象,
即為
對象成員
變數賦初始值,默認構造只有一個,構造可以有多個(
方法重載
),看傳參賦值的需求來區別用默認構造還是構造函數(帶參的是構造函數不帶參的是
默認構造函數
)