2

私はフォーラムを読み、いくつかのリンクを調べたところ、Java はすべて値渡しであることがわかりました。参照がどのように機能するかは理解していますが、プリミティブがどのように機能するかは理解していません。プリミティブでもオブジェクトでも、値渡しは同じように機能すると言われています。

サンプルプログラムを作成しました

public class BirthDate {
int lear;
int year; // Instance variable
public static void main(String [] args) {
    BirthDate bd = new BirthDate();
    bd.lear=200;
    bd.year=300;
    int a=56;
    bd.showYear(a,bd);
    System.out.println(a);
    System.out.println(bd.lear);
}
public void showYear(int a, BirthDate bd) {
        a=59;
        System.out.println(bd.lear);
        bd.lear=400;
        System.out.println(bd.lear);
        System.out.println(a);
}

}

上記のプログラムの出力は 200 400 59 56 400 です

ここで、プリミティブと参照の両方の場合にビットが渡された場合、showYear メソッドの参照値の変更が元の bd オブジェクトの変更 (値が 400 に変更) を反映し、プリミティブ データ型 iea ではない理由

誰でも提案できますか?

4

5 に答える 5

2

それらはすべて値渡しです。参照の場合、オブジェクト参照は値で渡されます。あなたが言う時-

bd.showYear(a,bd);

bd のアドレスを showYear メソッドに渡しています。分解してみましょう-

BirthDate bd = new BirthDate(); // Let's say a new object bd is created at address 10.

上記の Brithday bd と間違えないように、以下のパラメーター bd を bd2 に変更しました。

public void showYear(int a, BirthDate bd2) { // Parameter bd2 is pointing to address 10       

    bd2.lear=400; // bd2 followed the address 10 and changed bd's leap property. This doesn't change the fact that bd still is at address 10.
}
于 2013-08-02T10:07:02.707 に答える
0

参照が参照するオブジェクトのフィールドをメソッドで変更できますが、それを別のオブジェクトに再割り当てすることはできません。プリミティブは「不変」ですが、メソッドで値を変更することはできません。これが、Java パラメータがメソッド内で動作する方法です。

于 2013-08-02T10:02:35.133 に答える
0

どちらの場合も、値のみを渡します。U オブジェクト ID の値を、その場合ローカルである新しい参照変数 bd に渡します。だからあなたが電話するとき

     bd.lear=400; 

オブジェクトのリア変数の値を変更します。関数が終了すると、スタックが破棄されます。参照変数 bd も同様です。ただし、メイン関数 bd にはオブジェクトの id が含まれているため、オブジェクトは破棄されません。

プリミティブ型になると、u はこの中で showYear 関数のローカル変数 a の値を変更します

   a=59;

それを印刷し、オブジェクトのスタックで破棄されます。しかし、メイン関数のローカル変数は値 56 でまだ存在しています。

オブジェクトの一部を作成してから試してください

  bd.a=59; 

値が変化することがわかります。ローカル変数、インスタンス変数、クラス変数について読んでください..!

于 2013-08-02T10:07:37.153 に答える