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