標籤:object類 重載 技術 ges 應用 length var 問題 複製
本文主要講數組的初始化方法、可變參數列表以及可變參數列表對函數重載的影響。
數組初始化
定義數組的方式:
int[] arr1; 或 int arr1[];
數組初始化
通過上邊的定義,我們只是得到了一個數組的引用。這時已經為引用分配了儲存空間,但是還沒有給數組對象本身分配任何空間。想要給數組對象分配儲存空間,必須使用初始設定式。
a.在數組建立的地方進行初始化,如:
int[] arr1 = {1,2,3,4,5};
這種方式等價於使用new來進行儲存空間分配。
b.給數組的引用賦值,如:
int[] arr1 = {1,2,3,4,5};int[] arr2;arr2 = arr1;
複製的只是一個引用。如:
所有的數組都有一個固定成員length,通過它可以知道數組元素的個數。
c.當不確定數組元素的個數時的數組建立
當數組元素個數不確定時,我們可以直接使用new在數組裡建立元素。注意new可以應用於基本類型的數組,但是不能應用於單個的基本類型。
d.在定義數組的同時也可以進行初始化,當建立一個非基本類型的數組時,實際上建立的是引用數組。
可以用花括弧列表的形式來初始化對象數組,有兩種形式:
可變參數列表
標出了參數列表的使用方式、格式和對傳入參數的要求。
列表參數類型可以不同的情況
可變參數類型為Object,因為所有的類都直接或間接的繼承自Object類,可以向上轉型為Object,因此參數列表中的類型可以不一致。
輸出如:
列表參數類型必須相同的情況
當然可變參數參數列表也可以作為函數的一個參數傳入,如。這裡的參數列表中的參數類型為string,則所有的參數必須是string類型,與上面的程式不同。
可變參數列表中的參數可以是任何類型,包括基本類型
下面是可變參數列表為數組的例子:
從輸出結果的最後兩行可知,可變參數列表實際使用的是基本類型,不依賴自動封裝機制。
可變參數列表和自動封裝機制
但是,我們要知道,可變參數列表和自動封裝機制可以“共處”,如:
可變參數列表與函數重載
可變參數列表使重載過程變得複雜:
在上面的所有帶參數的函數調用,編譯器都會使用自動封裝機制來匹配重載的方法,然後調用最匹配的方法。但是不使用使用參數來f()時,編譯器會二義性錯誤:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method f(Character[]) is ambiguous for the type OverloadingVarargs
at thingjinjava.OverloadingVarargs.main(OverloadingVarargs.java:25)
那麼,如何解決這個問題呢?
可以嘗試著在某個方法中增加一個非可變參數來解決該問題。
可是,程式仍然無法通過編譯,還是報上面同樣的錯誤。
但是,當我們在給這兩個函數都添加一個非可變參數,問題就可以解決了。
Java之路(四)數組初始化