1

静的メソッド m1() にオブジェクト参照を渡す際に、なぜ null にならないのか、最後のステートメントでエラーが発生しないのか。出力は X

 class I {
        private String name;
        public String name() {            
            return name;
        }
        public I (String s) {            
            name = s;            
        }
    }

    class J {
        public static void m1 (I i){
            i = null;
        }
        public static void main (String[] arg)
        {
            I i = new I("X");
            m1(i);
            System.out.print(i.name());
        }
    }
4

3 に答える 3

1

Javaは値渡しです(リンクの2番目の回答を特別に読んでください)

I iスコープはiメソッドm1のみに限定されます。

実行すると、次のようになります。

`I i` in `m1()` points to `null` reference

I i method reference still points to `new I("X");`
于 2012-08-22T18:36:25.923 に答える
1

Java は値渡しなので、スコープはim1() に限定されます

public static void m1 (I i){ // i is copied from i which is in main method but it is another variable whose scope lies within m1() only

    i = null;  // original i in main lies in main() method scope

}

メソッド m1()の名前を変更すると、次のiように混乱が少なくなります。

public static void m1 (I iObj){ 
    iObj = null;  // i in main() method still points to Object

}
于 2012-08-22T18:37:40.050 に答える
1

Java は値渡しのみを使用します。iwithinの値を変更すると、そのパラメーターの値m1 のみが変更されます。内の変数には何もしません。imain

あなたを混乱させるかもしれない - それは確かに他の多くの人々を混乱させます - 引数は値によって渡されますが、パラメータの型がクラスの場合、その値は参照です...そして実際にi変数の値各事例は参考です。その参照は引き続き値渡しされます。引数の値は、パラメーターの初期値として直接コピーされます。ただし、パラメーター自体を変更する代わりに、パラメーター値が参照するオブジェクトを変更する場合、それは別の問題です。

void foo(StringBuilder builder) {
    builder.append("Hello");
}

void bar() {
    StringBuilder x = new StringBuilder();
    foo(x);
    System.out.println(x); // Prints Hello
}

詳細については、メソッドまたはコンストラクターへの情報の受け渡しに関する Java チュートリアルを参照してください。

于 2012-08-22T18:38:00.580 に答える