0

私はこれについて多くの投稿を読んできましたが、すべてがその前の回答に反論する傾向がある回答でいっぱいであり、それらはすべて上位の人々によるものであるように見えるので、非常に混乱しており、これが機能するかどうかを知りたいだけです:

public class Object{    

    private int someNumber = 5; 
    public void setSomeNumber(int newNumber){someNumber = newNumber;}   
}

public class Main {

    Object myObject = new Object();

public static void main(String[] args){ 

    changeNumber(myObject);     
}

void changeNumber(Object obj)
{
    obj.setSomeNumber(10);
}   
}

これは myObject.someNumber を 10 に変更しますか?

私の理解では、obj は myObject と同じメモリ内の場所を指しているため、obj を使用してメソッドを呼び出すことは、myObject を使用して呼び出すことと同じです。なぜなら、obj は myObject の単なるコピーではないからです。

ここでそれについてのスレッドを読み始めるまで、それは私には明らかだと思っていました笑

編集:コードを修正してくれてありがとう、私は例としてここに書きましたが、間違いは見られませんでした

みんなありがとう。また、値渡しと言っている人に混乱していたので、メモリ内のアドレスを渡しているのかどうかわからなかったので、参照を渡しているので不明確になりました。

4

3 に答える 3

2

あなたは正しいです。changeNumber() は、渡されたオブジェクトの someNumber 変数を変更します。コピーではなく、オブジェクト自体への参照を渡しています。

于 2013-02-04T05:34:32.243 に答える
0

このコードはコンパイルされませんが (オブジェクトを使用できず、静的メソッドの非静的データ フィールドからアクセスできません)、質問があります。

基本的にあなたは正しいです、そしてこれが理由です:

Java では、パラメーターをメソッドに渡す場合、それらは参照によって渡されますが、参照自体は値によって渡されます。これは、私が信じている最適化の理由で行われます。したがって、実際には、メモリ内の同じオブジェクトを指す別の参照が生成されます。これらの参照を単独で見ると、それらは異なりますが、両方とも同じオブジェクトを指しています。したがって、「changeNumber」メソッド内からオブジェクトの内部状態を変更すると、参照「obj」が参照するオブジェクトに移動して変更されます。

唯一の例外はプリミティブです。おそらく他の言語で学んだように、プリミティブは参照渡しではなく、値渡しです。

メソッドを呼び出してパラメーターを渡すときに正確に何が起こっているのかを理解すれば、混乱することはなくなります:)

お役に立てれば

于 2013-02-04T05:38:38.783 に答える
0

そうです、Java は参照によってオブジェクトを操作し、すべてのオブジェクト変数は参照であり、参照ではなく値によってメソッド引数を渡します。

この記事を見て、提供されている例でオブジェクトとメソッド引数の動作の違いを確認してください。

于 2013-02-04T05:39:15.150 に答える