Final關鍵詞形參傳值說明
【考題題幹】在下面程式标明的位置處插入哪條語句會導緻編譯錯誤?
public class FinalUse {
public static void main(String[] args) {
int x = 0;
final int y = 1;
int[] z = { 2 };
final int[] n = { 3 };
Use(x, y, z, n);
}
static void Use(final int x, int y, final int[] z, int[] n) {
// 插入内容
}
}
請考慮下面的選項:
A.x++
B.y++
C.y=x
D.z[0]++
E.n[0]++
F.z=n
【試題分析】聲明形參的時候可以在方法調用的參數調用之前加上關鍵字 final。 final 參數也可以叫
做空白最終變量,也可以當作常量。即在對其指派之前(例如方法調用之前),該變量為空(為初始化),
指派之後,在該變量的生存周期内隻能調用再也不能改變變量的值。final 變量隻可以被指派一次。在方
法調用時,final 形式參數被賦予實際參數的值。在方法内部,不能對 final 參數進行重新指派或者是修
改。
在 Use 方法中,x 是 final 類型的,是以 A 選項中 x++表示是可以改變 x 的值的,是以 A 會導緻編
譯錯誤。y,n[0]是 int 變量,是以 y, n[0]值是可以變化的,是以插入 B 和 E 選項都會編譯通過的。C 選
項是把 x 的值賦給 y,改變是 y 的内容,不會改變 x 的值,是以插入 C 選項會編譯通過的。在 D 選項中,
由于 z 是個 int 型數組,它是屬于複合類型,在進行值傳遞的時候,傳給形參的是位址值,而不是内容,
是以 final int[] z 就表示 z 數組不能在指向其他的數組對象,但是 z 數組中的内容是可以改變的,是以 z
[0]++表示的是内容上的改變,是以是沒有錯誤的,可以編譯通過的。F 選項正好與 D 選項相反,同理,
F 就是錯誤的。
【參考答案】AF
本習題參考網站:https://blog.csdn.net/sanqima/article/details/25624097
下面是個人對本題目的了解:
簡單舉例解說:
public class AN {
public static void main(String args[]) {
method1(3);
}
public static void method1(final int j) {//傳入此值時,已經将j初始為3,則不可在定義
j = 5; //此處報錯
System.out.println(j);
}
代碼片
.
public class AN{
public static void main(String[] args) {
int x = 5;
final int y = 1;
int[] z = { 2 };
final int[] n = { 3 };
Use(x, y, z, n);
}
static void Use(final int x, int y, final int[] z, int[] n) {
System.out.println(x);//傳入時已經預設該位址值的初始值5
y=x; //變量,位址值可變,不算固定
System.out.println(y);
z[0]++;
System.out.println(z[0]); //每次生成的z的位址值會變,但是該位址值的數值時固定的
n[0]++;
System.out.println(n[0]);//同y
/*y++;
y=x;
z[0]++;
n[0]++;
z=n;*/
System.out.println(z);//傳入時,已經預設賦予該位址值的初始值為2,是以不可改變
// 插入内容
}