2013-04-07 76 views
4

我是編程方面的新手,以及本網站,所以請原諒我,如果我搞砸了。我有一段時間搞清楚如何在這裏正確發佈我的代碼。什麼時候'void'方法影響參數?它何時影響原始對象?

package tester; 
import java.util.*; 
public class Mainclass2 { 
    public static void main(String[] args) { 

     int y = 3; 
     int[] x = {1, 2, 3, 4}; 

     editnumbersArray(x); 
     editnumbersNotArray(y); 

     System.out.println(x[2]); **//now this was changed from 3 to 9...** 
     System.out.println(y); //but this one went unchanged. 

    } 

    //this accepts 'x[]' into the 'a[]' parameter. 
    public static void editnumbersArray(int[] a){ 
     a[2] = 9; **//<---why does this one CHANGE the actual x[2] instead of just a[2]?** 
    } 

    //this accepts 'y' into the 'a' parameter. 
    public static void editnumbersNotArray(int a){ 
     a = 9; **//<--while this one only changes 'a' instead of 'y'?** 
    } 

} 

所以我的問題基本上是在那裏輸入的評論。爲什麼傳入方法的數組在傳遞給另一個方法的int不更改時會更改原始數組(x [])的值?我相信這是一個簡單的答案,但是當我做了我的研究時,我無法弄清楚要搜索什麼。我不知道這是叫什麼,所以我搜索的所有東西都導致我錯誤的方式。謝謝你的幫助!!

編輯:感謝您的地址類比!這是你可以向我解釋的最好方式。所以基本上當你將一個數組傳遞給一個參數時,它傳遞的是一個引用,而不是實際的值?所以當我在我的方法中進行調整時,它會改變陣列引用的內容。 我注意到這也發生在一個列表中。所以這個列表實際上並沒有按值傳遞?看來,如果數組/列表本身基本上是通過在編輯,不管我我的方法中的命名(一[]在這種情況下)。

編輯http://javadude.com/articles/passbyvalue.htm此頁面確實清除它。抱歉發佈重複的問題。問題是我不知道我想問什麼。我從來沒有聽說過這些術語「傳值/參考」,所以現在我知道

+1

對這個問題的更好的答案之一,已經被這麼多的形式已經問過:http://stackoverflow.com/a/9404727/680925 – Perception 2013-04-07 17:59:38

+0

可能重複[是Java「傳遞參考」? ](http://stackoverflow.com/questions/40480/is-java-pass-by-reference) – delnan 2013-04-07 18:04:57

回答

9

更改參數值本身從不影響Java中的參數,因爲所有參數都是按值傳遞的。然而,看看這個方法:

public static void editnumbersArray(int[] a){ 
    a[2] = 9; 
} 

那項任務做參數的不變化值。 a的值仍然是相同的參考,對相同的數組 - 它只是更改數組的內容

想象一下,如果我在一張紙上爲你寫了我的家庭住址。不管你對那張紙做了什麼 - 這不會改變我住的地方。但是,如果您訪問了地址並將前門塗成綠色,根本不需要更改紙張,我會看到變化。

它不同的概念區分是非常重要的:

  • 一個變量是一個名爲存儲位置;它保持一個值,即總是或者原始值(例如int)或參考。在我上面的例子中,這張紙就像變量。
  • A 參考只是一個允許您導航到對象的值。這不是對象本身。這就像紙上的地址。
  • 一個對象包含其他變量。可能有幾個變量都具有引用同一對象的值。這就像我的例子中的房子:我可以在幾張紙上寫下我的地址,但只有一個房子。

數組是一個對象,它充當其他變量的容器。所以a的值只是對數組的引用。

+0

爲偉大的想象+1:D – Maroun 2013-04-07 17:59:01

+1

你們剛剛吹噓我的想法。這很有道理,謝謝!希望有一天我能像你們一樣爲本網站提供答案。現在我甚至不能'投票'哈哈。 – Ryan 2013-04-07 18:08:53

+1

@RyanKlassy:每個人都必須從某個地方開始,瞭解這是Java中最重要的早期步驟之一。突然之間*所有的東西*可能會更有意義 - 這意味着將一個變量的值賦給另一個變量,垃圾回收等等。 – 2013-04-07 18:13:53

1

Java使用按值傳遞(您要搜索的內容)。基本上這意味着它會將參數的副本傳遞給方法。這意味着你不能通過使用=操作符來改變指向的東西。

這就是爲什麼(int a)版本不改變a。

但是,在Object或數組的情況下,它不會生成Object或數組的副本,它會複製對Object或數組的引用。這意味着你有兩個變量,原始的和在你的例子中的(int[] a),它們都指向內存中的同一個點。對任一變量的更改都會影響其他變量。

按值傳遞,按引用傳遞,按值傳遞引用是您想要搜索的更多信息的類型。

相關問題