2

tricky()実際のオブジェクト自体ではなく、値のみが重要であるため、メソッドに渡されたオブジェクト/データメンバーのコピーであることを理解していると思います。arg1しかし、 print ステートメントは、コピーであるとarg2が実際にメソッド内で切り替えられることを保証します。これが情報を元のオブジェクトに中継せず、結果としてそれらを切り替える理由がわかりません。arg1.xメソッドがメソッド内のおよびarg1.yデータ メンバーに正常にアクセスできることを確認します。

// This class demonstrates the way Java passes arguments by first copying an existing
// object/data member. This is called passing by value. the copy then points(refers)
// to the real object

// get the point class from abstract window toolkit
import java.awt.*;

public class passByValue {


static void tricky(Point arg1, Point arg2){

  arg1.x = 100;
  arg1.y = 100;
  System.out.println("Arg1: " + arg1.x + arg1.y);
  System.out.println("Arg2: " + arg2.x + arg2.y);

  Point temp = arg1;
  arg1 = arg2;
  arg2 = temp;
  System.out.println("Arg1: " + arg1.x + arg1.y);
  System.out.println("Arg2: " + arg2.x + arg2.y);
}




public static void main(String [] args){

  Point pnt1 = new Point(0,0);
  Point pnt2 = new Point(0,0);
  System.out.println("X1: " + pnt1.x + " Y1: " +pnt1.y); 
  System.out.println("X2: " + pnt2.x + " Y2: " +pnt2.y);
  System.out.println(" ");
  tricky(pnt1,pnt2);
  System.out.println("X1: " + pnt1.x + " Y1:" + pnt1.y); 
  System.out.println("X2: " + pnt2.x + " Y2: " +pnt2.y);  

}
}
4

5 に答える 5

5

オブジェクト参照がコピーされ、コピーされた参照は引き続きメモリ内の同じオブジェクトを指します。これが、コピーされた参照を使用してオブジェクトを変更できる理由です。ただし、パラメータ参照を変更すると、元の参照ではなくコピーが変更されます。これが、メソッド内で参照をリダイレクトしても、渡した参照がリダイレクトされない理由です。

これで問題が解決することを願っています。

于 2012-07-24T02:59:53.397 に答える
3

Java は値渡しを行いますが、渡すのはオブジェクトの参照の値であり、これにより参照渡しの効果が得られます (プリミティブの場合、値渡しのように動作します)。

しかし、Java は常に値渡しです。

于 2012-07-24T03:01:33.500 に答える
2

Java値渡しですが、オブジェクト参照を渡すと、参照値がメソッドに渡され、そこからメソッドがオブジェクトメンバーの値を変更できます。

次のコードを見てください。

public class Passbyvalue {

    public static void main(String[] args) {
        // TODO code application logic here
        Animal animal=new Animal();
        animal.name="Dog";
        System.out.println(animal.name);
        testIt(animal);
        System.out.println(animal.name);
    }


    public static void testIt(Animal animal){
        animal.name="Cat";
    }

}

出力

犬猫

これは、reference(Originalとmethod)の両方が同じオブジェクトを指しているためです。

    __________
   |          |                 
   |          |<------------- Orignal Reference 
   | Object   |   
   |          |<------------- Method Reference
   |          |
   |__________|

この効果をより明確に見たい場合は、メソッドで新しいオブジェクトを作成してください

public class Passbyvalue {

    public static void main(String[] args) {
        Animal animal=new Animal();
        animal.name="Dog";
        System.out.println(animal.name);
        testIt(animal);
        System.out.println(animal.name);
    }


    public static void testIt(Animal animal){
        animal=new Animal();
        animal.name="Cat";
    }

}

出力:Dog Dog

これで、メソッド参照はヒープ内の他のオブジェクトに投稿されます。

于 2013-01-02T11:34:09.820 に答える
1

最初に両方のオブジェクトを新規作成すると、次のように出力されます。

X1: 0 Y1: 0
X2: 0 Y2: 0

Tricky() を呼び出すと、pnt1 と pnt2 への参照を値で渡し、それらを arg1 と arg2 に割り当てます。つまり、メモリ内の場所を渡しています。次に、値を出力します。

Arg1: 100100
Arg2: 00
Arg1: 00
Arg2: 100100

temp を使用してスワップを行うと、アドレスがスワップされます。したがって、メイン メソッド pnt1 と pnt2 に戻ると、元のアドレスが保持されます。したがって、印刷すると次のようになります。

X1: 100 Y1:100
X2: 0 Y2: 0

これは、いくつかの追加の背景を持つ関連スレッドです。

于 2012-07-24T03:10:17.043 に答える
0

以前は「グラフィカルなアプローチ」で説明していたので、お役に立てば幸いです。mainで、メソッドを呼び出す前に、次のようになりtrickyます。

pnt1 -> Point(x=0; y=0)
pnt2 -> Point(x=0; y=0)

内部trickyメソッド、arg1およびはそれぞれと参照arg2のコピーであるため、同じオブジェクトを指しています。pnt1pnt2

pnt1 -> Point(x=0; y=0) <- arg1
pnt2 -> Point(x=0; y=0) <- arg2

参照によりarg1、最初のPointオブジェクトを変更します。

pnt1 -> Point(x=100; y=100) <- arg1
pnt2 -> Point(x=0; y=0) <- arg2

次に、temp最初のPoint(100; 100)オブジェクトへの参照を「ポイント」します。その後、-Point(0,0)-を参照してarg1いる同じオブジェクトをポイントし、すでにポイントされている同じオブジェクト、つまりPoint(100; 100)をポイントします。したがって、メソッド内でメモリアドレスを交換し、参照していました。arg2arg2temptrickyarg1arg2

pnt1 -> Point(x=100; y=100) <- arg2 (temp also pointing this object)
pnt2 -> Point(x=0; y=0) <- arg1

しかし、メソッドが終了すると、arg1とarg2(およびtemp)はスコープ外(消える)になり、次のようになります。

pnt1 -> Point(x=0; y=0)
pnt2 -> Point(x=0; y=0)

メソッド内のすべての変更がとで実行されることを考えると、予想どおりに変更されていません。これpnt1は参照のコピーのみでした。pnt2trickyarg1arg2

したがって、内部でtrickyはオブジェクトのコンテンツを変更できます(オブジェクトへの参照があります)が、オブジェクトのコピーしかないため、元の参照を変更することはできません。したがって、Java値によって渡されます(実際には、値によって渡される参照)。

于 2012-07-24T04:06:01.360 に答える