温故(2):pass by value
在Java領域中,這是一個被討論得非常多的話題。可是,至今我發現還有很多人沒有搞清楚(當然也包括本人)。直到看了這篇文章“Does Java pass by reference or pass by value? ”,才算完全明白。
從中,我發現一個很有趣的東西:圖形比文字更能讓人看懂、更直觀。在上面那篇文章中,我想大家只要看看圖(畫的真棒)就可大致明白其中原理了。
為了便于理解,本人大致總結一下:
1、pass-by-reference和pass-by-value概念上有何不同?
推薦以下這篇文章“Reference 不為人知的一面”,從中摘取一段,解釋的比較清楚:到底什么是pass by value?什么又是 pass by reference 呢?打個比方,pass by value 就是資料的「分身」傳遞過去,pass by reference 就是資料的「本尊」傳遞過去。
2、傳遞methods參數才會出現pass-by-reference/value的問題
大家都知道Java中所有對象變量都是reference,但這與我們所說的pass-by-reference/value沒有什么關系。pass-by-reference/value只會在方法調用中才會出現,也就是說方法的參數是通過pass-by-reference還是pass-by-value進行傳遞。
3、Java中都是以pass-by-value的方式傳遞方法參數
Java中所有的參數都是采用pass-by-value進行傳遞,無論是Primitive type(int,short,float等),還是Objects。
4、區分可變對象(Mutable Objects)和不可變對象(Immutable Objects)
這兩種對象很容易引起誤會,看下面兩個例子:
EX?1:
public class Test {
??? public static void test(String str) {
??????? str = "World";?//1
??? }
??? public static void main(String[] args) {
??????? String string = "Hello";
??????? test(string);
??????? System.out.println(string);
??? }
}
運行結果:
Hello
-----------------------------
EX 2:
public class Test {
??? public static void test(StringBuffer str) {
??????? str.append(", World!"); //2
??? }
??? public static void main(String[] args) {
??????? StringBuffer string = new StringBuffer("Hello");
??????? test(string);
??????? System.out.println(string);
??? }
}
運行結果:
Hello, World!
為什么一個能改變,而另一個不能改變呢?其實這就是不可變和可變對象引起的問題。根據第一篇文章你就應該很容易弄明白,String是不可變對象,在代碼1處的str變量已經變成指向了另一個對象的reference(賦值語句相當于new),也就是說它只修改了另一個對象;而StringBuffer是可變對象,在代碼2處它修改的是同一個對象。
轉載于:https://www.cnblogs.com/sunsonbaby/archive/2004/12/14/77190.html
總結
以上是生活随笔為你收集整理的温故(2):pass by value的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实例——在编程过程中进行单元测试
- 下一篇: 欢迎参与Java 事务讨论