簡體   English   中英

為什么Java引用在本程序中沒有像預期的那樣工作

[英]Why is Java reference is not working like expected in this Program

我正在解決一個問題,我發現Java引用並沒有像我期望的那樣工作。 當然,我是罪魁禍首:),有人可以請我為什么以下情況發生。 我先在這里發布代碼。

package misc.matrix;

public class ReferenceTester {
    public static void main(String args[]){
        Boolean[][] input = { 
            {true  ,false ,true ,true ,false },
            {false ,true  ,true ,true ,true },
            {true  ,true  ,true ,true ,true },
            {true  ,true  ,true ,true ,true },
            {true  ,false ,true ,true ,true }
        };

        print(input);

        for(Boolean[] eachRow:input){
            for(Boolean eachVal:eachRow){
                eachVal = Boolean.TRUE;
            }
        }
        print(input);

        /*Expected output  
            true  true  true  true  true  
            true  true  true  true  true  
            true  true  true  true  true  
            true  true  true  true  true  
            true  true  true  true  true
        */
    }

    /**
     * Simply prints the array
     */
    private static void print(Boolean[][] input) {
        for(Boolean[] outArray:input){
            for(Boolean iVal:outArray){
                System.out.print(iVal?iVal+"  ":iVal+" ");
            }
            System.out.println();
        }
    }
}

如果您看一下上面的程序,我想要做的就是將Array中的所有值更改為true並打印它。 但它只是再次打印輸入。 有人可以告訴我為什么會這樣。 最初我在程序中使用了原始boolean,但由於我不想創建副本,我使用了包裝器Boolean Class,它是一個Java OBJECT而不是原語。 (Isnt eachVal是一個JAVA OBJECT!?!?!?!?)為什么會在Java中發生這種情況。 為什么不打印所有值都是真的?

請指教。

您無法在foreach循環中修改源對象。 你的循環必須是這樣的循環標准:

for(int i = 0; i < input.length; i++){ 
    for(int j = 0; j < input[i].length; j++){ 
        input[i][j] = true; 
    } 
}

編輯:更確切地說,循環中的eachVal是一個指針 ,而不是一個引用; 因此將其設置為指向不同的值不會更改原始值。

如果您希望單獨確認,則此處給出了foreach循環在幕后使用的確切形式。

你的問題是循環改變數組的值:

    for(Boolean[] eachRow:input){
        for(Boolean eachVal:eachRow){
            eachVal = Boolean.TRUE;
        }
    }

在每次迭代中,變量eachVal保存對數組單元格內容的引用,正如您所期望的那樣。 但問題是,因為Boolean是一個不可變類型 - 也就是說,你不能在創建Boolean對象后改變它的值 - 你的賦值不起作用。 實際上,您實際在做的是更改eachVal引用所指向的對象。 也就是說,因為eachVal是一個來自inputeachRow的獨立變量,所以你只需重新分配這個變量而不必觸及數組的內容。

如果您希望我擴展或澄清任何特定點,請告訴我。

@mmyers得到了答案,你要求更多細節,但我無法在評論中說明:

所以你有一個對booleans的引用數組(它是ALWAYS引用),並且在你的每個循環中你創建一個引用,指向與該數組成員相同的布爾值。

每次迭代都會更新引用以指向數組中的下一個指針指向的內容。

當您使用equals時,您只需重新指定引用以指向其他內容。

如果你想更新數組中的對象,它必須是可變的(布爾不是),你必須使用mutator而不是equals。

您嘗試的是類似於以下內容:

    int[] arr = { 1, 2, 3 };
    for (int i : arr) {
        i = 0;
    }

這不會將數組中的所有值都設置為0. Java會按值傳遞所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM