

按理說第一張圖參考參考的是堆記憶體里面的地址,int和ArrayList的操作我都能理解,int是保存在堆疊上的基本資料型別,ArrayList是堆上的物件。但Integer的操作我就不能理解了,Integer 10000也超過了方法區常量池里能保存的,按理說也應該是建立在堆上的物件,但是兩個參考對Integer的操作不一致。這是為什么呢
uj5u.com熱心網友回復:
沒看明白你要說的問題,是想問,為什么a+=1會回影響b嗎?如果是這個問題,你就犯了一個錯誤,任何型別,通過=賦值的,賦值完以后就可能和原來的物件沒關系了,也就是說=左邊的變數重新參考了另一個物件(這個物件可能和原來不是同一個物件)
Integeg b = a; //b指向a參考的物件
a += 1; //a指向了新的物件Integer(100001),已經不是原來a參考的那個物件了,但是b還是參考原來a參考的物件,所以b沒變
但是,不是通過=來修改物件,而是修改屬性,那就不一樣了。修改屬性并不會導致變數指向新的物件,所以它的改變也會改變原來參考物件的改變,在例子就是你的 f.add(1); //這里你并沒有用=來改變f,而是通過呼叫add方法來改變 f 物件的屬性,因為 f 和 g 參考的物件相同,所以 g 也看到變變化。如果你在 f.add(1); 之后,加上 f = new ArrayList<>(); //用=來改變 f 指向別的物件,你再列印 g 看看它是不是跟著 f 也變成了空的List?這里告訴你 g 肯定不空,也就是說 g 不會因為因為發生 f = xx 而改變,同樣的,Integet b 也不會因為 a = xx 而改變。
所以要注意=修改變數,和通過方法修改屬性的區別。
uj5u.com熱心網友回復:
老哥你說的沒錯轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98991.html
標籤:Java相關
上一篇:哪位大神能教教我這道題怎么寫嘛
下一篇:請教一個問題
