2014-06-30 23 views
-1

我是新手。
我讀過,局部變量的範圍將在一個塊內(糾正我,如果我錯了)。 在這裏,主要方法的局部變量(名單lili1和StringBuffer的y)表現得像個實例變量,而這些變量(字符串y1和int x)行爲類似於局部變量。爲什麼?帶有列表,字符串和字符串緩衝區的局部變量行爲

public class Test { 
    public static void addValues(ArrayList<String> list, StringBuffer sb, int x){ 
     list.add("3"); 
     list.add("4"); 
     list.add("5"); 

     sb.append("String Buffer Appended !"); 
     x=x+10; 
    } 

    public static void addValues(ArrayList<String> list, String sb, int x){ 
     list.add("3"); 
     list.add("4"); 
     list.add("5"); 

     sb = sb + "is Appended !"; 
     x=x+10; 
    } 

    public static void main(String[] args) { 
     ArrayList<String> li = new ArrayList<>(); 
     ArrayList<String> li1 = new ArrayList<>(); 
     StringBuffer y=new StringBuffer("ab"); 
     int x=10; 
     String y1=new String("ab"); 
     li.add("1"); 
     li.add("2"); 
     li1.add("1"); 
     li1.add("2"); 
     System.out.println("b4 : "+li+" , y = "+y+" , y1 = "+y1+" x= "+x); 
     addValues(li,y,x); 
     System.out.println("Af : "+li+" , y = "+y+" x= "+x); 
     addValues(li1,y1,x); 
     System.out.println("Af : "+li1+" , y1 = "+y1+" x= "+x); 
    } 
} 

輸出:

b4 : [1, 2] , y = ab , y1 = ab x= 10 
Af : [1, 2, 3, 4, 5] , y = abString Buffer Appended ! x= 10 
Af : [1, 2, 3, 4, 5] , y1 = ab x= 10 
+1

另請參閱http://stackoverflow.com/questions/4658453/difference-between-mutable-objects-and-immutable-objects –

+0

對不起,發佈此作爲答案,因爲我的聲譽確實不允許我評論你的問題。但這個問題被多次詢問。在這裏,檢查[this](https://stackoverflow.com/questions/15871825/why-is-an-arraylist-parameter-modified-but-not-a-string-parameter),[this](https:// stackoverflow.com/questions/8798403/string-is-immutable-what-exactly-is-the-meaning)和[this](https://stackoverflow.com/questions/40480/is-java-pass-by-reference -or通按值) – epipav

回答

3

在該ArrayList和StringBuffer的情況下,要傳遞到一個可變對象反映上保持相同的參考任何變量任何修改的參考。

在字符串的情況下,你太傳遞一個參考,但其不變的,所以當您連接東西給它,它實際上是創建一個新的String對象和方法內分配一個新的參考變量,你實際上並沒有修改對象本身。

而在INT的情況下,所有的基元分配和按值傳遞的,所以它實際上使得它的價值的副本,並將其傳遞給方法,所以任何你做給該變量的方法中犯規影響變量以外。

0

Java總是按值傳遞,意味着它總是將變量(原始變量和引用變量)的副本傳遞給方法的代碼塊。

當我們傳遞一個對象引用變量(在這種情況下,ArrayList和StringBuffer的),其實我們要複製有位模式引用變量,而不是真正的對象是自己,在你的addValues法新副本是指完全相符與在main方法中聲明的對象相同,因此無論何時修改對象成員的值,copy和actuall對象引用變量都會看到更改。

默認情況下,字符串是不可變的,而且默認情況下它們是不可變的。所以無論何時我們將它們作爲參數傳遞給方法,這些方法只會從String和int中獲取值的副本。

您在java中與「Stack and Heap」有關的問題。你可以看this video作爲參考