java中的參數傳遞是按引用傳遞還是按值傳遞


  最近去面試,有一個面試官問到java中參數傳遞的問題,感覺自己對於這一塊還是理解的不夠深。今天我們就一起來學習一下Java中的接口和抽象類。下面是本文的目錄大綱:

一 . 什么是按值傳遞,什么是按引用傳遞

二 . java中的參數傳遞是按值傳遞還是按引用傳遞

三.總結

 

若有不正之處,請多多諒解並歡迎批評指正,不甚感激。

 

一 . 什么是按值傳遞,什么是按引用傳遞

按值調用(call by value) : 在參數傳遞過程中,形參和實參占用了兩個完全不同的內存空間。形參所存儲的內容是實參存儲內容的一份拷貝

按值傳遞在基本數據類型數據傳遞中比較好理解,測試代碼如下:

public class test {
    public static void main(String[] args) {
        int age = 0;
        System.out.println("before change age="+age);
        change(age);
        System.out.println("after change age="+age);
    }
    
    public static void change(int a){
        a=20;
    }
}

運行結果:

before change age=0
after change age=0

這個結果相信很多朋友已經猜到:因為在main方法中調用change(age)時,真正傳遞給change方法的參數只是age的一個副本,所以修改這個副本,並不能修改原來age的值。

 

按引用調用:在參數傳遞的過程中,形參和實參完全是同一塊內存空間,兩者不分彼此。

例如:

main()
{
 int a=0;
 func(&a);
 printf("%d\n",a);
}
func(int *b)
{
 *b=10;
}

 

咳咳,這貌似是C語言的按引用傳遞。java的安引用傳遞寫不出來。

 

二. java中的參數傳遞是按值傳遞還是按引用傳遞

在下結論之前,我們還是看一個例子:

public class PassByValue {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "PassByValue [name=" + name + "]";
    }

    public static void main(String[] args) {
        PassByValue myDear = new PassByValue();
        myDear.setName("dontKnow");
        String mylove  ="dontKnow";
        int herAge=0;
        System.out.println("myDear name="+myDear.getName());
        System.out.println("myLove ="+mylove);
        System.out.println(herAge);
        stringChange(mylove,myDear,herAge);
        System.out.println("============================================================");
        System.out.println("myDear name="+myDear.getName())
        System.out.println(mylove);
     System.out.println(herAge)
     
} public static void stringChange(String a,PassByValue b,int age){ a="gaoshan";//這一句相當於a=new String("gaoshan") b.setName("gaoshan");
     age=20; } }

運行結果如下

myDear name=dontKnow
myLove =dontKnow
0
============================================================
myDear name=gaoshan
myLove =dontKnow
0

我們發現,myDear 中的name 屬性通過stringChange()方法改變了,myLove的值並沒有改變。

這里有一個疑問:myDear和mylove 都是引用數據類型,為什么myDear的屬性值會改變,而mylove 沒有改變呢?

其實原因在注釋中已經說了:在stringChange方法中,a="gaoshan";這一句等價於a=new String("gaoshan"),實際上a作為數據引用發生了改變,指向了一個新的內存地址,而myDear作為數據引用,並沒有發生改變,仍然指向main方法中myDear所指向的對象。

三.總結

在java中,不存在按引用調用,因為在參數傳遞過程中,不管傳遞的是基本數據類型的變量,還是對象的引用,其實都是傳遞的一個副本。

在上面的例子中,myDear 所指向的對象之所以會發生改變,是因為在stringChange方法中,通過myDear 的副本b對myDear 所指向的對象進行操作,改變了對象屬性,但是

myDear 本身作為對象引用並沒有發生改變。而myLove 沒有發生改變是因為在stringChange方法中直接改變了myLove 副本a的值,並沒有對myLove 所指向的對象進行修改,所以我們看到 main方法中的myLove所指向的對象並沒有發生改變

 

本文參考

java參數傳遞(超經典):http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM