天天看點

Final關鍵詞形參傳值

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,是以不可改變
	        //  插入内容
	     }