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

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

一 . 什麼是按值傳遞,什麼是按引用傳遞java

二 . java中的參數傳遞是按值傳遞仍是按引用傳遞面試

三.總結ide

 

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

 

一 . 什麼是按值傳遞,什麼是按引用傳遞測試

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

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

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;
    }
}

運行結果:code

before change age=0
after change age=0htm

這個結果相信不少朋友已經猜到:由於在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

相關文章
相關標籤/搜索