亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么輸出會是“100”和“500”?

為什么輸出會是“100”和“500”?

蠱毒傳說 2021-10-27 16:56:48
我很困惑為什么下面程序的輸出會打印 100 和 500?任何人都可以解釋這是如何發生的嗎?public class ArraysInJava{    public static void main(String[] args)    {        int[] a = new int[3];         a[1] = 50;         Object o = a;         int[] b = (int[])o;         b[1] = 100;         System.out.println(a[1]);         ((int[])o)[1] = 500;         System.out.println(a[1]);    }}
查看完整描述

3 回答

?
ibeautiful

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



查看完整回答
反對 回復 2021-10-27
?
桃花長相依

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


查看完整回答
反對 回復 2021-10-27
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

如果您調試代碼,您可以找到以下操作:

  1. 首先 a = [0,0,0]

  2. a = [0,50,0]

  3. o = [0,50,0]

  4. b = [0,50,0]

  5. b = [0,100,0] -> o = [0,100,0] -> a = [0,100,0]

  6. 打印 a[1] = 100

  7. o[1] = 500 -> o = [0,500,0] -> b = [0,500,0] -> a = [0,500,0]

  8. 打印 a[1] = 500

這就是 a[1] 的值是如何改變的。

基本上有相同的數組 a 一直在改變。


查看完整回答
反對 回復 2021-10-27
  • 3 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號