2013-03-15 36 views
2
public class test { 
    public static void main(String[] args) { 
     boolean flag=false; 
     char[] c=new char[5]; 
     c[0]='e'; 
     read(flag, c); 

     System.out.println(c[0]); 
     System.out.println(flag); 
    } 

    public static void read(boolean flag, char[] c){ 
     flag=true; 
     c[0]='a'; 
    } 
} 

在上面的代碼中,我發現一個有趣的問題:char[] c已經改變,打印結果正確,但布爾標誌沒有被改變!我不知道這是怎麼發生的? 現在,我也想改變旗子,這可以怎麼辦? 感謝您的幫助!一些參數可以在方法來改變,但有些不是在java中

+2

區別在於一個參數是參考參數(數組),另一個參數是原始參數。由於Java方法參數只是按值傳遞的,因此在方法中不能更改圖元,也不能更改參數*的引用,但可以更改所引用對象的內容。想想這個陣列就像通過一個蛋箱一樣。由於「傳遞價值」,您不能更換蛋箱,但您可以更換包裝箱中的雞蛋。 – 2013-03-15 00:15:15

+2

我一直髮現[this](http://javadude.com/articles/passbyvalue。htm)是理解java參數傳遞 – 2013-03-15 00:18:27

回答

8

boolean由值來傳遞。如果您在read方法中更改它,則只會更改本地副本,而不會更改外部值。

然而,參考文獻c被有價值地傳遞,實際上使c引用的數組通過引用而被傳遞。因此,在這裏更改c的元素確實會影響外部數組。

+4

+1的一個很好的寫法,因爲是正確的,並提到兩者都通過值傳遞,你幾乎讓我在「布爾值通過值」,但我看到你提到「對c的引用按價值傳遞「。 – 2013-03-15 00:17:07

+0

是的,你是對的!這種情況與C語言中傳遞的參數類似。但在C中,我可以使用&flag作爲參數,* flag = true,這可以更改標誌。我怎麼能在JAVA中做到這一點?你有一個好方法嗎? – city 2013-03-15 00:51:53

0

不同之處在於Java如何處理數組和基元。

陣列

爪哇處理陣列(和其他的目的,太)作爲參考的類型。這意味着Java不會爲數組本身提供方法。相反,該方法收到一個數字(參考),告訴它數組存儲在哪裏。

因此,接收數組的任何方法都沒有獲取數組的副本;它正在改變原始數組。如果通過a)調用對象的方法或b)對數組下標腳本來修改對象,它將更改原始對象。

基元(boolean等)

原語從陣列的工作方式不同。方法不會接收對基元的引用;他們收到原語的副本。這是因爲基元比對象簡單,並且與複製對象相關的性能損失不適用於基元的最大約8個字節。

因此,你recieving您傳遞給該方法的布爾值的副本。因此,更改副本不會影響原件。

希望這有助於!

0

你用兩個參數做了不同的事情。您只需指定布爾值,它只會更改布爾值的副本。

在另一方面,你用你的數組引用參數的副本來修改它指向數組。相反,如果你做了一個簡單的任務:c = null;c = new char[30];你可能會改變你的參數副本,但不會影響調用者的副本,就像布爾值一樣。

當然,有很多與參考表達比一個布爾表達式,你可以做更多。

相關問題