Java中的传值与传引用
曾經對java中傳值還是傳引用的問題十分困惑,而且也被問到過許多次,無論是面試,還是平時我們平時的討論中。
在stackoverflow上面瀏覽時,無意中發現了跟這個問題有關的論題,于是深入地查看了,感覺獲益匪淺,于是結合自己過去的經驗,寫了這篇博客跟大家分享。
以前我覺得是這樣的,java中的基本數據類型和String是傳值的,而其它的類類型的數據則是傳引用的。不過現在我覺得不是這樣的。
*******************************************************************************
我覺得人們對于傳值還是傳引用的困惑源于這樣一個事實:不同的人對于“引用”的定義理解不同。具有C++背景的人認為“引用”跟C++里面的引用是同一個概念,而具體C語言背景的人則認為“引用”具有“指針”的含義,等等。java中傳值還是傳引用取決于“引用”的含義。
?
Java中的傳值是這樣的:
1 public void method1(int i){ 2 i++; 3 System.out.println(i); //5 4 } 5 public void method2(String s){ 6 s+="a"; 7 System.out.println(s); //aa 8 } 9 10 int i=4; 11 method1(i); 12 System.out.println(i); //4 13 14 String a="a"; 15 method2(a); 16 System.out.println(s);//a View Code但是,在java中,總是傳值的。難以理解的事實是:Java把對象當引用來傳遞,而這些引用則是以值的形式來傳遞的。即對象實參的引用在初始化方法形參的時候復制了一份實參的引用,而這個拷貝的引用同實參的引用指向同一個對象。
示例如下:
1 public void foo(Dog d) { 2 d.getName().equals("Max"); // true 3 d = new Dog("Fifi"); 4 d.getName().equals("Fifi"); // true 5 } 6 7 Dog aDog = new Dog("Max"); 8 foo(aDog); 9 aDog.getName().equals("Max"); // true View Code示例中aDog.getName()將返回“Max”。當對象引用以值的形式來傳遞的時候,d在方法中并沒有被覆蓋。
否則的話,形如:
1 public void foo(Dog d) { 2 d.getName().equals("Max"); // true 3 d.setName("Fifi"); 4 } 5 6 Dog aDog = new Dog("Max"); 7 foo(aDog); 8 aDog.getName().equals("Fifi"); // true View Code?
轉載于:https://www.cnblogs.com/littlepanpc/p/3842219.html
總結
以上是生活随笔為你收集整理的Java中的传值与传引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [原创]2014年上半年测试书籍推荐
- 下一篇: Java集合---HashSet的源码分