0

理解できないことに出くわし、それができるとは思いもしませんでした。

私は Android でこのコード ブロックをいじっていましたが、私が興味をそそられたのはこれでした:

public boolean onTouch(View v, MotionEvent event){
    Rect outRect = new Rect();
    _btn.getHitRect(outRect);
    // ... rest of code cut
    // outRect fields of that Rect object is 'filled' in.
}

ボタン ウィジェットのを取得するために、メソッドに渡されたRectオブジェクトを Android の Java が直接変更できるのはどうしてですか。outRectRect

Javaには「参照渡し」のようなものはないと思っていたので、これには驚きまし ?

はい、私は以前に尋ねられたこの質問を読みましたが、困惑していますか、それとも Android のことですか?

誰でもこれに光を当てることができますか?

4

5 に答える 5

4

オブジェクトの場合、アドレスは値であり、プリミティブ値と同様に値がコピーされます。しかし、それはオブジェクトを指す値であり、オブジェクトはコピーされません。メモリ内に一度だけ存在し、操作できます。ここに画像の説明を入力

于 2012-07-07T00:06:22.870 に答える
3

outRect参照がメソッドに渡され、メソッドgetHitRectによって参照されるオブジェクトが変更されoutRectます。参照は値によって渡されます。

詳細な説明については、次の記事を参照してください: http://javadude.com/articles/passbyvalue.htm

于 2012-07-07T00:08:15.607 に答える
1

リンク先の質問に対する最高評価の回答は、これを非常に明確に説明しています。

Java は常に値渡しです。難しいのは、Java がオブジェクトを値渡しの参照として渡すことを理解することです。

次に、あなたが何を驚かせたかを私が誤解していない限り、質問している動作に謎を残さない 2 つの例を示します。

于 2012-07-07T00:14:32.583 に答える
1

The reference to the Rect object is passed by value but the Rect object itself is allocated on the heap so it can be updated. In effect, this gives you pass-by-reference semantics. However, you cannot change the reference; in other words, something like this won't work:

public void someFunction(Rect r) {
  r = new Rect(); // will not be seen by the calling function
}
于 2012-07-07T00:10:50.160 に答える
1

Java のメソッドへのすべてのパラメーターは、プリミティブとオブジェクトの両方で、値によって渡されます。ただし、Java でオブジェクトを参照する方法は、値よりも C++ ポインターに近いものです。たとえば、Java では任意のオブジェクト値が value を取ることができますnullが、C++ ではポインターのみが値を取ると考えてnullください (一方、オブジェクトと参照* は常に有効な初期化された値です)。

しかし、オブジェクト値の値渡しは実際には何を意味するのでしょうか? これは、オブジェクトのコピーを作成し、呼び出されたメソッドが使用できるようにスタックにプッシュすることを意味します。一方、ポインターの場合は、ポインター値をスタックにプッシュすることを意味します。このようにして、呼び出し元と呼び出されたメソッドの両方が、オブジェクト値が格納されている同じメモリ位置にアクセスできます。したがって、呼び出されたメソッドで実行された変更は、呼び出し元のメソッドに反映されます。

* 参照に破損したデータが含まれる場合があります。

于 2012-07-07T00:21:44.820 に答える