回覆列表
  • 1 # 中外古今說說

    回答這個問題之前,我先提個問題,Java是百分百的面向物件程式設計嗎?我認為不是。java中的各種基本型別如int,float,double,boolean等,這些是既沒有方法也沒有屬性的,這些不是物件,所以Java不是100%面向物件。而這些基本型別作為引數的時候就是值傳遞,其它的陣列、物件等型別作為引數傳遞給方法的時候就是引用傳遞。

    按值傳遞:值傳遞是指在呼叫方法時將實際引數複製一份傳遞到方法中,這樣在方法中如果對引數進行修改,將不會影響到實際引數。看過class裡的位元組碼就會發現,這類引數傳遞是把變數的值,複製一份,壓入計算棧。如果直接常量,也會向計算棧裡壓入一個立即數。所以按值傳遞的引數,不會被呼叫的方法改變。如下圖,add方法的3個引數,就都是值傳遞。fun()在呼叫的時候,把arr[0]的值,x的值,常數1送進方法add。add裡完成加法運算,返回結果。

    按引用傳遞:陣列、物件等型別的引用的值作為引數傳遞給方法。這個時候是把陣列、物件的引用的值,作為引數傳遞給方法。方法裡可以根據引用,直接去讀取這些陣列的元素值,或物件的屬性值。相應的,也可能修改這些陣列和物件。如下圖,div方法的3個引數,就都是引用傳遞。fun()在呼叫的時候,把arrA、arrB、arrC這三個的引用的值送進方法div。div裡把陣列arrA[0]除以陣列arrB[0]的值,再把結果賦值給arrC[0]。所以arrC的元素值,改變了。

    值傳遞適合傳遞的數值量少的,或者要經常傳入常量的情況。如果傳入的數值多,一般還是先把這些數值放到一個數組或者物件裡,然後用引用傳遞給方法。

    引用傳引數很適合這樣一種情形,就是需要輸出結果,但方法本身的返回值又有其它含義。例如上圖的div方法,該方法返回值是boolean型,表示除法運算是否有效合法,而除法運算的結果則是存到c[0]裡,返回的。(這裡只是舉個例子)

    兩種方式要根據程式的設計的實際情況來進行選擇。本想詳細說一下引用的概念,以後有機會吧。最後問大家一個問題,如果在引用傳遞時輸入null,這時還是不是引用傳遞呢?如下圖。

  • 中秋節和大豐收的關聯?
  • 華為會要求員工用華為手機嗎,小米會要求員工用小米手機嗎?