Java方法引數的傳遞方式
C和C++提供了兩種引數傳遞方式,一種是值傳遞,一種是引用傳遞,但是在Java中總是使用值傳遞的方式傳遞引數,一種是值的拷貝,一種是引用的拷貝,這兩者都是值的拷貝,接下來舉例子說明。
二話不說直接把測試程式碼貼上來再分析:
import lombok.Data; /** * User: R * Date: 2018/10/18 * Time: 10:22 * Created with IntelliJ IDEA. */ @Data class Person { private Long id; private String name; public Person(Long id, String name) { this.id = id; this.name = name; } public String toString() { return "id:" + this.id + ",name:" + this.name; } } public class SomeTest { public static void main(String[] args) { Person person = new Person(1001L, "張三"); //1、原始資料 System.out.println("1 -> " + person.toString()); //2、呼叫changeProperty()之後的資料 changeProperty(person); System.out.println("2 -> " + person.toString()); //3、呼叫changeObject()之後的資料 changeObject(person); System.out.println("3 -> " + person.toString()); } /** * 改變物件的屬性 * * @param p */ public static void changeProperty(Person p) { p.setName("李四"); } /** * new一個新的物件 * * @param p */ public static void changeObject(Person p) { p = new Person(1002L, "王五"); } }
這裡有兩個方法,changeProperty(Person p)方法是改變傳入物件的屬性(成員變數),changeObject(Person p)方法是將傳入的物件賦予一個新的物件,執行的效果如下:
通過結果我們可以看的出來,呼叫changeProperty()方法起作用了,但是呼叫changeObject()方法沒有任何變化,下面說一下自己的理解。
1、在呼叫changeProperty()方法的時候,p得到pserson的引用的拷貝,這時候p和person都引用同一個物件(1001L,"張三"),這時候p改變了其引用物件的值,由於p和person都指向同一個物件,所以person的值也被改變了,方法結束之後p被銷燬。
2、在呼叫changeObject()方法的時候,p得到pserson的引用的拷貝,然後p指向了一個新的物件,由於p只是對person一引用的拷貝,所以p的引用的改變不會影響到person的引用,即p指向了(1002L,"王五")這個物件,但是person的引用沒有任何變化,所以呼叫changeObject()方法之後,person沒有任何變化。
現在再舉一個通俗一點的例子,比如上文的p和person是兩個人,現在有兩杯飲料A(張三)和B(王五),值傳遞和引用傳遞就好比兩個人用一根吸管和兩個人分別用兩根吸管,在呼叫changeProperty()方法的時候結果都是一樣的,不管是用一根吸管還是兩根吸管都是喝的同一杯飲料(張三),但是呼叫changeObject()方法的時候就會有區別,如果兩個人用同一根吸管(引用傳遞,使用同一個引用),p如果拿上這根共用的吸管去喝B飲料(類似上文的指向王五),那person也只能去喝B飲料(person也指向王五),但是如果是兩個人分別用自己的吸管(值傳遞,引用的拷貝),p拿上自己的吸管去喝B飲料這一個動作對person沒有任何的影響。
以上只是個人的理解,如果有理解錯誤或不恰當的地方請多指教。