題目:
Integer a = 18; Integer b = 19; System.out.println("交換前a:" + a + "--->b:" + b); swap(a, b); System.out.println("交換後a:" + a + "--->b:" + b);
初步思路:
1、java傳參如果傳基本類型,操作不改變原數值,傳對象,操作會改變包裝類型
2、Integer內有常數數組[-128-127]之間的數都是常數
初步結論:
當Integer的值在常數數組內時,交換不改變原值,不在數組內時會發生改變
實驗:結果很尷尬
思考:
其實方法的傳參(封裝類對象),實際上是在方法中重新創建了一個對象,並指向傳進來的參數對應的內存地址。
如:將對象A傳到方法中充當參數A,實際上參數A和對象A是兩個不同的對象,只不過是指向了同一個內存地址,更改後的數據會直接寫入到內存地址中,所以對象傳參會更改原有的值。
Integer相關:
Integer a = *;實際上是Integer a = Integer.valueOf(*);
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
當*不在[-128-127]之間時,Integer a = *;相當於Integer a = new Integer(*);
前面有說對象傳參實際上是修改了內存地址上的數據,雖然new Integer也對應了一個內存地址,但是它內部的屬性是final的,無法被更改,也就是說這個內存地址裏的東西沒法改動,你在方法裏的修改相當於重新指向了一塊新的地址,對原地址的數據毫無影響。