為什麼改變引用變數的屬性值卻可以呢?請看下面的解答。
java中的資料型別
#Java中資料型別分為兩大類:基本型別與參考型別。對應的,變數也分這兩種類型:基本型別和引用型別。
基本類型的變數保存原始值,也就是它所代表的值就是數值本身;
而引用型別的變數所保存的值是引用值,"引用值"指向記憶體空間的位址,代表了某個物件的引用,而不是物件本身,物件本身存放在這個引用值所表示的位址的位置。
基本型別包括:byte,short,int,long,char,float,double,Boolean,returnAddress。
引用類型包括:類別、介面類型和陣列。
java中只有值傳遞
在日常編碼中,會經常看到以下現象:
#1、對於基本型別參數,在方法體內對參數進行重新賦值,不會改變原有變數的值。
2、對於引用型別參數,在方法體內對參數重新賦予引用,不會改變原有變數所持有的引用。
3、方法體內對參數運算,不會改變原有變數的值。
4、對於參考型別參數,方法體內會對參數所指向物件的屬性進行操作,將改變原有變數所指向物件的屬性值。
舉個例子:
public class Main { private static void getMiddleOne(boolean b, Boolean boo, Boolean[] arr){ b = true; boo = new Boolean(true); arr[0] = true; } //测试 public static void main(String[] args) { boolean b = false; Boolean boo = new Boolean(false); Boolean[] arr = new Boolean[]{false}; getMiddleOne(b, boo, arr); System.out.println(b); System.out.println(boo.toString()); System.out.println(arr[0]); /** * output: * false * false * true */ } }
我們只要了解下面兩點就可以解答上面的現象了:
1、基本資料類型的數值就是數值本身,所以範例中的b的值就是false;包裝類別因為會自動裝箱拆箱,所以可以跟基本型別一樣處理,所以範例中boo的值就是false;陣列是參考型,所以arr的值就是指向該Boolean[]的引用。
2、java中只有值傳遞沒有引用傳遞,所以傳入getMiddleOne方法的三個參數分別是b的值拷貝, boo的值拷貝, arr的值拷貝。
透過上面兩點就可以清楚了,getMiddleOne方法中執行的b=true 和boo = new Boolean(true) 都是把新值賦給了他們的拷貝,所以不改變原變數的值;同樣,arr[0] = true 是把true複製給了arr的拷貝所指向的數組的第一個元素,arr的值和arr的拷貝的值都是該數組的引用,所以arr的拷貝所指向的陣列和arr所指向的陣列是同一個,所以改變arr的拷貝的陣列的元素會同樣影響到原變數arr。
總結
java中只有值傳遞,基本型別傳遞的是值的副本,引用型別傳遞的是引用的副本
以上是java的參數傳遞(只有值傳遞沒有引用傳遞)的詳細內容。更多資訊請關注PHP中文網其他相關文章!