在Java方法中參數列表有兩種類型的參數,基本類型和引用類型。
基本類型:值存放在局部變量表中,無論如何修改只會修改當前棧幀的值,方法執行結束對方法外不會做任何改變;此時需要改變外層的變量,必須返回主動賦值。
引用數據類型:指針存放在局部變量表中,調用方法的時候,副本引用壓棧,賦值僅改變副本的引用。但是如果通過操作副本引用的值,修改了引用地址的對象,此時方法以外的引用此地址對象會被修改。(兩個引用,同一個地址,任何修改行為2個引用同時生效)。
這兩種類型都是將外面的參數變量拷貝一份到局部變量中,基本類型為值拷貝,引用類型就是將引用地址拷貝一份。
像引用數據類型的我們可以直接傳遞他的實例對象到方法中改變他的值 不用返回,這個實例對象的值也會變,包裝類型和基本數據類型不行。
package com.zhao.tool.test; /** * java 的值引用和地址引用探究 * Java方法中參數列表有兩種類型的參數,基本類型和引用類型。 * 基本類型:值存放在局部變量表中,無論如何修改只會修改當前棧幀的值,方法執行結束對方法外不會做任何改變;此時需要改變外層的變量,必須返回主動賦值。 * 引用數據類型:指針存放在局部變量表中,調用方法的時候,副本引用壓棧,賦值僅改變副本的引用。但是如果通過操作副本引用的值,修改了引用地址的對象,此時方法以外的引用此地址對象當然被修改。(兩個引用,同一個地址,任何修改行為2個引用同時生效)。 * 這兩種類型都是將外面的參數變量拷貝一份到局部變量中,基本類型為值拷貝,引用類型就是將引用地址拷貝一份 */ public class ValueAndAddressReferences { /** * 基本數據類型 * 方法執行完 局部變量不再被使用到,等待被GC回收 * @return */ public static int getAInt(){ int a=0; addParamInt(a); return a; } static void addParamInt(int c){ c++; } public static Integer getAInteger(){ Integer a=0; addParamInteger(a); return a; } static void addParamInteger(Integer c){ c++; } public static ClassObject getClassObject(){ ClassObject title =new ClassObject(); addParamClassObject(title); return title; } static void addParamClassObject(ClassObject s){ s.setTitle("武漢病毒來襲,在家 2020/2/8 ‘正月十五晚上’"); } public static void swapObjectReference(ClassObject object1, ClassObject object2) { ClassObject temp = object1; object1 = object2; object2 = temp; } public static void main(String[] args) { //當方法參數為基本類型時,是將外部變量值拷貝到局部變量中而進行邏輯處理的,故方法是不能修改原基本變量的 System.out.println("基本數據類型: "+ValueAndAddressReferences.getAInt()); /** * 當傳入參數為包裝類型時,為對象的引用地址拷貝 * 因為Java中的自動裝箱機制,當在方法中執行 c++時,實際在編譯后執行的是 c = Integer.valueOf(true)+1,即又會產生一個新的Integer對象。 */ System.out.println("包裝類型: "+ValueAndAddressReferences.getAInteger()); /** * 對於引用類型的方法參數,會將外部變量的引用地址,復制一份到方法的局部變量中,兩個地址指向同一個對象。 * 所以如果通過操作副本引用的值,修改了引用地址的對象,此時方法以外的引用此地址對象也會被修改。(兩個引用,同一個地址,任何修改行為2個引用同時生效) */ System.out.println("方法參數為類的對象引用時 : "+ValueAndAddressReferences.getClassObject().getTitle()); /** * 交換2個對象 * 只是對方法中的兩個局部變量的對象引用值進行了交換,不會對原變量引用產生任何影響的。 */ ClassObject c=new ClassObject("對象一"); ClassObject c1=new ClassObject("對象2"); System.out.println("對象一 :"+c.getTitle()+"\t對象二:"+c1.getTitle()); ValueAndAddressReferences.swapObjectReference(c,c1); System.out.println("對象一 :"+c.getTitle()+"\t對象二 :"+c1.getTitle()); } }
package com.zhao.tool.test; public class ClassObject { public ClassObject() { super(); } public ClassObject(String title) { this.title = title; } private String title; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
注意 List這些如果傳參進去也是引用的地址。
參考: https://www.cnblogs.com/lingyejun/p/11028808.html