web-dev-qa-db-ja.com

Javaが値による呼び出しを使用するか、オブジェクト参照が渡されるときに参照による呼び出しを使用するかどうか、混乱していますか?

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]になります。参照を渡すと混乱しますが、値による呼び出しでも参照による呼び出しでも、どのように機能しますか?なぜ

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();  

    }
}
19
user617597

参照のvalueを渡します。

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

家を変更することもできます(たとえば、ベクターにオブジェクトを追加したり、ベクターをクリアしたりすることにより)。ただし、同じ紙を手にしていても、住所から同じ家に行くことができます。

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

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

22
Tharwen

値渡しです。どちらの場合でも、参照の参照のを、メソッドの引数であるlocalメソッドの参照に置きます。

2
Pshemo

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

2

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

1
arnabkaycee

Javaで値を渡すことは、渡される値のコピーを渡すことを意味します。Javaで参照で渡すことは、アドレス自体を渡すことを意味します。In Java引数は常に値によって渡されます。Javaは値による受け渡しのみをサポートします。

Javaオブジェクトの場合、オブジェクト参照自体は値で渡されるため、元の参照とパラメーターコピーの両方が同じJavaオブジェクトを参照します。Javaプリミティブも値で渡されます。

1
user3070568

Javaプログラミング言語は常に値による呼び出しを使用します。 Javaでは、メソッドへのすべてのパラメーターは値で呼び出されるか、値で渡されます。 Cay S. HorstmannとGarry Cornellは、著名な著書「Core Java Volume-I Fundamentals」で、Javaプログラミング言語は常に値による呼び出しを使用することを述べています。 。つまり、メソッドはすべてのパラメータ値のコピーを取得し、メソッドは渡されたパラメータ変数の内容を変更できません。Javaは2種類のメソッドパラメータを使用します:

  • Javaプリミティブ型
  • Javaオブジェクト参照

プリミティブ型をメソッドに渡してみると非常に単純明快に見えますが、オブジェクトをメソッドに渡す場合は不明瞭になります。興味深いことに、オブジェクト参照がメソッドに渡されると、メソッドはオブジェクト参照のコピーを取得し、元のコピーと正式なコピーの両方が同じオブジェクトを参照するため、メソッド内からオブジェクトパラメータの状態を変更できます。 。

次の記事はよく説明しています 値による呼び出しと参照による呼び出し

1
Krishan

Javaはオブジェクト参照を使用します。引数は参考値です。つまり、値によって呼び出されます。値はオブジェクトの参照です。

1
RokL

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

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

1
Ashwinee K Jha

Java "参照渡し")では、参照自体が値で渡されます。

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

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

vc = null

または、

vc = new Vector();

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

0
Chip

Javaは「Call by Valueコンセプト」で動作します。スタックとヒープが視覚化されている場合、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"の参照で5が割り当てられます:呼び出しメソッドでは、ワークスペースに "x"という名前のローカル変数(引数として渡されます)があります。値はそのワークスペースでのみ変更されます。この関数からの制御が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

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

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

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

0
Sushil Jain

値渡し

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

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

0
user2233159