最近去面試,有一個面試官問到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