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が変更され、結果が正しく出力されましたが、ブールフラグは変更されていません。これがどのように起こったのか分かりませんか?そして今、私もフラグを変更したいのですが、これはどのように行うことができますか?ご協力いただきありがとうございます!

4

3 に答える 3

8

boolean値によって渡されます。メソッドで変更readすると、ローカルコピーのみが変更され、外部値は変更されません。

ただし、への参照c値によって渡されるため、参照によって参照される配列は事実上c参照によって渡されます。したがって、ここの要素を変更するとc、外部配列に影響します。

于 2013-03-15T00:15:49.327 に答える
0

あなたは2つの議論で異なることをします。ブール値に割り当てるだけで、ブール値のコピーのみが変更されます。

一方、配列参照引数のコピーを使用して、それが指す配列を変更します。代わりに、単純な割り当てを行った場合、c = null;またはc = new char[30];引数のコピーを変更したが、ブール値のように呼び出し元のコピーには影響を与えなかった場合。

もちろん、ブール式よりも参照式でできることはたくさんあります。

于 2013-03-15T00:23:28.127 に答える
0

違いは、Javaが配列とプリミティブを処理する方法にあります。

配列

Javaは、配列(およびその他のオブジェクトも)を参照型として処理します。つまり、Javaはメソッドに配列自体を提供しません。むしろ、メソッドは、配列が格納されている場所を示す番号(参照)を受け取ります。

したがって、配列を受け取るメソッドは、配列のコピーを取りません。元の配列を変更しています。[]a)オブジェクトのメソッドを呼び出すか、b)配列に添え字を付けることによってオブジェクトを変更すると、元のオブジェクトが変更されます。

プリミティブ(booleanなど)

プリミティブの動作は配列とは異なります。メソッドはプリミティブへの参照を受け取りません。プリミティブのコピーを受け取ります。これは、プリミティブがオブジェクトよりも単純であり、オブジェクトのコピーに関連するパフォーマンスの低下が、プリミティブの最大約8バイトには適用されないためです。

したがって、メソッドに渡すブール値のコピーを受け取ります。したがって、コピーを変更しても元のコピーには影響しません。

これがお役に立てば幸いです!!

于 2013-03-15T00:20:52.530 に答える