23
public class program1{

    public static void main(String args[]){

        java.util.Vector vc=new java.util.Vector();

        vc.add("111");
        vc.add("222");

        functioncall(vc);

        vc.add("333");

        System.out.println(vc);

    }

    public static void functioncall(java.util.Vector vc){     

        vc=null;    

    }
}

上記のプログラムの出力は [111,222,333] です。しかし、次のプログラムを実行すると、出力は [333] になります。reference を渡すときに混乱します。値による呼び出しか参照による呼び出しかでどのように機能しますか? なぜ

public class program1{

    public static void main(String args[]){

        java.util.Vector vc=new java.util.Vector();

        vc.add("111");
        vc.add("222");

        functioncall(vc);

        vc.add("333");

        System.out.println(vc);

    }

    public static void functioncall(java.util.Vector vc){

        vc.removeAllElements();  

    }
}
4

11 に答える 11

23

参照の値を渡します。

少し前にここに投稿されたのを見た類推を恥知らずに盗むために、使用する各識別子が住所が書かれた紙であると想像してください。住所は家を指しています。

家を変更することはできますが (たとえば、ベクターにオブジェクトを追加したり、ベクトルをクリアしたりします)、同じ紙を持っていることになり、住所から同じ家に移動できます。

ベクトルを null に設定すると、アドレスを削除するだけです。

この記事では、より詳細に説明します。

于 2012-05-25T07:21:43.063 に答える
3

vc を参照コピーとして (常に) 渡します。次に vc = null;orvc = new Vector()を実行すると、vc ローカル属性からの参照を変更するだけなので、メインの属性が変更されないのは正常です。

于 2012-05-25T07:22:04.423 に答える
2

値渡しです。どちらの場合も、メソッドのローカル参照であるメソッドの引数に参照への参照のを入れます。

于 2012-05-25T07:25:53.740 に答える
1

Java と C は常に値渡しです。参照による呼び出しという用語は、正式な引数で & 演算子を使用する C++ に厳密に適用されます。オブジェクト参照の場合、参照は実引数から仮引数にコピーされます。

于 2013-04-07T17:20:02.253 に答える
1

Java はオブジェクト参照を使用します。引数は参考値です。したがって、値はオブジェクトの参照である値による呼び出しです。

于 2012-05-25T07:20:49.463 に答える
1

vc は、メソッドの呼び出しに使用されたベクトルの参照を含む新しい変数です。この参照は元のベクトル参照のコピーであるため、null に変更しても元のベクトルには影響しません。

ただし、これは元のベクトルへの参照であるため、ベクトルを変更すると、実際には元のベクトルが変更されます。そのため、Java は常に値による呼び出しを使用します。ここでは、値がたまたま参照になっています。

于 2012-05-25T07:20:52.977 に答える
0

Javaは「CallbyValueの概念」で動作します。スタックとヒープが視覚化されている場合、Javaはローカルワークスペース内の変数の値を見つけようとします。ローカルで見つからない場合は、ヒープ内にあるオブジェクトを見つけようとします。

class Foo
{

int x;

public void call(int x)

{

    x++;

}

public static void main(String[] args)

{

       Foo foo = new Foo();

       foo.x = 5;

       System.out.println(foo.x);

       foo.call(foo.x);

       System.out.println(foo.x); 


}


}

上記のプログラムの出力は次のようになります:5、5説明:メインメソッドでは、xの値は「foo:呼び出しメソッドでは、ワークスペースに「x」(引数として渡される)という名前のローカル変数があります。この関数からの制御がmainメソッドに戻ったとき、値はそのワークスペースでのみ変更されます。mainのワークスペースでは、「x」の値は5のままです。

class Foo

{

int x;

public void call(int y)

{

    x++;

}

public static void main(String[] args)

{

       Foo foo = new Foo();

       foo.x = 5;

       System.out.println(foo.x);

       foo.call(foo.x);

       System.out.println(foo.x); 

}


}

上記のプログラムの出力は次のようになります:5、6

説明:mainメソッドでは、「foo」を参照してxの値に5が割り当てられます。callメソッドでは、ワークスペースに「x」(引数として渡される)という名前のローカル変数がありません。したがって、javaは、「call」を介して参照してそれを見つけます。関数が呼び出され、「x」の値が5になっている場合、callメソッドはその値を「6」にインクリメントするため、この関数からの制御がmainメソッドに戻ると、その値は参照、つまり「foo」に変更されます。ここではfoo参照に「x」を出力したため、「x」は6です。

これがあなたの概念を明確にするのに役立つことを願っています。

よろしく、スシルジャイン

于 2012-12-23T03:35:46.460 に答える
0

値渡し

実パラメータ (または引数式) は完全に評価され、結果の値は、メソッド/関数の実行中に仮パラメータの値を保持するために使用される場所にコピーされます。その場所は通常、アプリケーションのランタイム スタック上のメモリのチャンクです (これは Java がそれを処理する方法です) が、他の言語ではパラメーター ストレージを別の方法で選択できます。

参照渡し 仮パラメータは、実パラメータのエイリアスとして機能するだけです。メソッド/関数が (読み取りまたは書き込みのために) 仮パラメーターを使用する場合は常に、実際には実パラメーターを使用しています。 Javaは厳密に値渡しです

于 2013-04-01T18:12:52.960 に答える
0

Java の「参照渡し」では、参照自体が値渡しされます。

したがって、参照自体を変更することはできませんが、参照が指すオブジェクトを変更することはできます。

したがって、removeAll呼び出しは に作用するVectorため、結果が表示されます。ただし、参照自体を次のように変更すると:

vc = null

また、

vc = new Vector();

これらの変更は新しい (または null ) オブジェクトを指すため、それ以降の変更はオブジェクトに反映されません。main

于 2012-05-25T07:24:51.257 に答える