参照渡しか値渡しか? [closed] 質問する

参照渡しか値渡しか? [closed] 質問する

新しいプログラミング言語を学ぶときに遭遇する可能性のある障害の1つは、その言語がデフォルトで値渡しまたは参照渡し

皆さんに質問です。皆さんの好きな言語でお願いします。どうやってそれは実際に行われているのでしょうか?そして起こりうる落とし穴?

もちろん、これまでに遊んだことのある言語であれば何でも好きな言語になります。人気のある不明瞭な難解な新しい古い...

ベストアンサー1

以下は私自身の寄稿ですJavaプログラミング言語

まずコードをいくつか:

public void swap(int x, int y)
{
  int tmp = x;
  x = y;
  y = tmp;
}

このメソッドを呼び出すと、次の結果になります。

int pi = 3;
int everything = 42;

swap(pi, everything);

System.out.println("pi: " + pi);
System.out.println("everything: " + everything);

"Output:
pi: 3
everything: 42"

「実際の」オブジェクトを使用しても同様の結果が表示されます。

public class MyObj {
    private String msg;
    private int number;

    //getters and setters
    public String getMsg() {
        return this.msg;
    }


    public void setMsg(String msg) {
        this.msg = msg;
    }


    public int getNumber() {
        return this.number;
    }


    public void setNumber(int number) {
        this.number = number;
    }

    //constructor
    public MyObj(String msg, int number) {
        setMsg(msg);
        setNumber(number);
    }
}

public static void swap(MyObj x, MyObj y)
{
    MyObj tmp = x;
    x = y;
    y = tmp;
}

public static void main(String args[]) {
    MyObj x = new MyObj("Hello world", 1);
    MyObj y = new MyObj("Goodbye Cruel World", -1); 

    swap(x, y);

    System.out.println(x.getMsg() + " -- "+  x.getNumber());
    System.out.println(y.getMsg() + " -- "+  y.getNumber());
}


"Output:
Hello world -- 1
Goodbye Cruel World -- -1"

したがって、Javaはパラメータを渡すことは明らかである価値によって、の値として円周率そしてすべてそしてそのMyObj オブジェクト交換されません。「値による」は唯一の方法Javaでは、メソッドにパラメータを渡すために使用します。(例えば、C++のような言語では、開発者は「' パラメータの型の後に続く)

今、難しい部分、少なくともJavaの初心者の開発者のほとんどを混乱させる部分です。(ジャバワールド
原作者:トニー・シンテス

public void tricky(Point arg1, Point arg2)
{
    arg1.x = 100;
    arg1.y = 100;
    Point temp = arg1;
    arg1 = arg2;
    arg2 = temp;
}
public static void main(String [] args)
{
    Point pnt1 = new Point(0,0);
    Point pnt2 = new Point(0,0);
    System.out.println("X: " + pnt1.x + " Y: " +pnt1.y); 
    System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
    System.out.println(" ");
    tricky(pnt1,pnt2);
    System.out.println("X: " + pnt1.x + " Y:" + pnt1.y); 
    System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);  
}


"Output
X: 0 Y: 0
X: 0 Y: 0
X: 100 Y: 100
X: 0 Y: 0"

トリッキーpnt1 の値を正常に変更しました。これは、オブジェクトが参照によって渡されることを意味しますが、そうではありません。正しい記述は次のようになります。オブジェクト参照値によって渡されます。

トニー・シンテスからの追加情報:

このメソッドは、値渡しされているにもかかわらず、pnt1 の値を正常に変更します。しかし、pnt1 と pnt2 の交換は失敗します。これが混乱の主な原因です。main() メソッドでは、pnt1 と pnt2 は単なるオブジェクト参照です。pnt1 と pnt2 を tricky() メソッドに渡すと、Java は他のパラメータと同様に参照を値渡しします。つまり、メソッドに渡される参照は、実際には元の参照のコピーです。下の図 1 は、Java がオブジェクトをメソッドに渡した後、同じオブジェクトを指す 2 つの参照を示しています。

図1
(ソース:javaworld.com

結論あるいは長い話を短くすると:

  • Javaはパラメータを渡す価値によって
  • 「値によって」それは唯一の方法Javaでメソッドにパラメータを渡す
  • 使用してオブジェクトからのメソッドパラメータとして与えられた変更されます参照が元のオブジェクトを指すオブジェクト。(そのメソッド自体が値を変更する場合)

便利なリンク:

おすすめ記事