3 回答

TA貢獻1993條經驗 獲得超6個贊
讓我們一行一行地做...
public class ArraysInJava
{
public static void main(String[] args)
{
int[] a = new int[3]; // a = {0, 0, 0} as default value for int elements is 0
a[1] = 50; // a = {0, 50, 0}
Object o = a; // o = a = {0, 50, 0} - casting affects the variable type, the referenced object remains the same (recall that objects are saved by reference)
int[] b = (int[])o; // b = o = a = {0, 50, 0}
b[1] = 100; // b = o = a = {0, 100, 0}
System.out.println(a[1]); // Prints 100
((int[])o)[1] = 500; // b = o = a = {0, 500, 0}
System.out.println(a[1]); // Prints 500
}
}
所有的轉換都不做任何事情,因為它只影響你在編譯時可以做的事情。例如,你不能寫,o[1]因為它在編譯時不是數組。
編輯
Carlos Heuberger確實在評論中提出了一個重要觀點。我認為缺少的部分是關于數據類型的。
有兩種主要的數據類型:原始數據類型和非原始數據類型。
原始數據類型包括byte、short、long、float、double、char、boolean。當您將這些數據類型的變量傳遞給方法或分配給另一個變量時,您正在傳遞值。
int a = 15;
int b = a; // b now holds 15
非原始數據類型(您可以稱它們為對象類型)是除上述所有類型之外的所有其他類型。這包括數組(也是基本類型的數組)、枚舉、類、接口和String.
當您將這些數據類型的變量傳遞給方法,或將它們分配給另一個變量時,您傳遞的是對象的引用。
int[] a = {1, 2};
Object b = a; // "b" now holds the reference (memory address) of the "a"
int[] c = b; // "c" now also points to the exact same array
b = null; // "b" holds no memory reference now, "a" and "c" continues to hold reference of the same array

TA貢獻1860條經驗 獲得超8個贊
繪制內存模型并跟蹤每個引用,如果您理解這一點,請在代碼中的注釋中查看我的內容,這將消除您的困惑。 a, b, and o是參考
a[1]------> 50
a[1]------> 50 <------------o[1]
a[1], b[1]------->50 <---------------o[1]
a[1], b[1] -------->100 <-----------o[1] (but the value 50 is overwritten with 100)
a[1], b[1] -------->500<-----------o[1] (but the value 100 is overwritten with 500)
int[] a = new int[3];
a[1] = 50; // a------> 50,
Object o = a; // a------> 50 <------------o
int[] b = (int[])o; // a, b------->50 <---------------o
b[1] = 100; //a, b -------->100 <-----------o(but the value 50 is overwritten with 100)
System.out.println(a[1]); // so prints 100
((int[])o)[1] = 500; //a, b -------->500<-----------o(but the value 100 is overwritten with 500)
System.out.println(a[1]); // hence prints 500

TA貢獻1816條經驗 獲得超4個贊
如果您調試代碼,您可以找到以下操作:
首先 a = [0,0,0]
a = [0,50,0]
o = [0,50,0]
b = [0,50,0]
b = [0,100,0] -> o = [0,100,0] -> a = [0,100,0]
打印 a[1] = 100
o[1] = 500 -> o = [0,500,0] -> b = [0,500,0] -> a = [0,500,0]
打印 a[1] = 500
這就是 a[1] 的值是如何改變的。
基本上有相同的數組 a 一直在改變。
添加回答
舉報