关于Java中final
的功能,我有一个相对简单的问题。
当我编译这段代码时:
import java.util.*;
import java.lang.*;
import java.io.*;
class Arrays
{
public static void main (String[] args) throws java.lang.Exception
{
final int[] myArray = { 1,2 };
myArray[1] = 3;
System.out.println (myArray[1]);
}
}
号码" 3"得到印刷。但是,我的印象是final
意味着该数组中保存的值(myArray)不能再变化且不变。
这里还有另一段代码:
final int [] a1 = {1, 2};
int [] b1 = {3, 4};
a1 = b1; System.out.println (a1[1]);
我相信系统应该打印" 2"因为a1
已完成,并且数组中的值是常量。但是,我的朋友认为它应该是" 4"。请帮助我澄清对final
的理解。
答案 0 :(得分:2)
int[]
是一种对象类型(不是基元而不是int
)。最终引用意味着在引用Object
实例时无法重新分配引用。
final int [] a1 = {1, 2};
a1 = {3,4}; // <-- illegal, a1 is final.
事实上,Java在两种情况下都会产生值 final
(Object
的值是它的'引用)。
答案 1 :(得分:0)
最终意味着无法更改值。
但是当声明int[] myArray;
时,myArray会保存数组的引用,而不是值。
声明,
myArray [1] = 3;
更改该位置的内容,因为它未声明为final。
语句myArray = (any value);
是非法的,因为我们正在更改被声明为final的引用。
答案 2 :(得分:0)
将变量定义为final时,无法将其重新分配给其他值。
final int a = 2;
a = 5; \\ error
同样,当你使用最终数组时:
final int[] arrA = {1,2,3};
arrA = new int[]{4, 5, 6}; \\ error
但您可以随时更改数组中的值,因为它们不是final
。因此,似乎您的第二个示例将无法编译。如果您不想更改数组中的值,那么最好使用enum
。
答案 3 :(得分:0)
final
修饰符声明变量无法更改。但是,对象/数组变量实际上只是未命名对象/数组的句柄。由于对象变量的值是句柄,因此它确保句柄不能更改。该句柄另一端的数组与final
完全无关。
final int myInt = 5; //myInt cannot change (5 is the value of myInt)
final int[] myArr = {1,2};
myArr[0] = 3; //legal. myArr is a handle to a int[] and we're not modifying the handle