2011-12-15 24 views
0

クラス型をメソッドのパラメータとして渡すと、ポインタが渡されます。メソッドのパラメータを編集すると、渡された元のオブジェクトインスタンスも編集されます例public void changeColor(Color color)という名前のメソッドは、次のコードない場合:クラス型パラメータ渡しのJavaプリミティブ

public void changeColor(Color color) 
{ 
    color = new Color(20, 100, 50); 
} 

を、あなたはそうのような値と呼ば:

Color color = new Color(10, 20, 30); 
System.out.println(color.toString()); 
changeColor(color); 
System.out.println(color.toString()); 

コンソールの両方の行が(java.awt.Color[r=10,g=20,b=30]java.awt.Color[r=20,g=100,b=50])異なっている必要があり、これVA lueが変更され、ポインタが渡されます。一方、あなたは原始的であるint型の値を、使用している場合、あなたは異なる結果を得る:

public void changeNumber(int i) 
{ 
    i = 10; 
} 

をし、そのようにあなたは、値と呼ば:

int n = 5; 
System.out.println(n); 
changeNumber(n); 
System.out.println(n); 

コンソールが5を印刷しません。 10ですが、両方の行には5と表示されています。ことで、私が持っていた場合は、この:

public class A 
{ 
    public int i; 
    public Color c; 

    public A(int n, Color color) 
    { 
     i = n; 
     c = color; 
    } 
} 

そして実行可能なクラスの

...

public static void main(String[] args) 
{ 
    A a = new A(10, new Color(10, 40, 23)); 
    changeA(a); 
} 

public static changeA(A varA) 
{ 
    varA.i = 54; 
    varA.c = new Color(40, 30, 264) 
} 

ウィル私の内側それはAのポインタの一部であるかのように、クラスでも動作しますかchangeA(a)を実行した後、メインメソッドのaiが変更されない場合の値。もしそうでなければ、私は何をして変化するのでしょうか?

+0

ここから始める:http://stackoverflow.com/questions/8263446/how-to-verify-call-by-value-of-java –

+0

これは間違っています。 'changeColor()'に渡される 'color'オブジェクトは変更されません。実際にコードを実行しましたか? Javaは参照によって値を渡します。つまり、あるメソッドが、呼び出し元の参照が新しいものを指すようにすることはできません。 – erickson

答えて

0

は、私はそれがAのポインタの一部であったか、私はchangeA(a)は

実行した後、mainメソッドでAIが変更されない場合は、値がするかのようにも動作するクラス内ウィルパラメータAに渡されたAインスタンスのiの値が変更されます。

しかし、私はが "Aのポインタの一部であるかのように"動作しているとは言いません。 Aへの参照は不変の単一の値です。あなたが参照するオブジェクトの状態を変更しています。

ところで、これは "参照渡し"という意味ではなく、C#やC++などの言語で実装されているように参照渡しには似ていません。また、変数/メンバー/何でも。

+0

Nit:C++とC#は参照による呼び出しを持っていますが、Cでは参照による呼び出しがありません。 (ポインタの受け渡しは値渡しです。) –

1

Javaで参照渡しを探しています。これは不可能です。詳細については、thisの質問に対する回答をご覧ください。

+1

私は 'call-by-reference'に同意しません。私は、*すべての* '値による呼び出し '(オブジェクトが' call-by-value-of-the-reference')であるか、私が好む、 'call-by-オブジェクトのための 'call-by-object-sharing'を使用します。 [評価戦略](http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing)の記事を参照してください。 'call-by-reference 'は、異なるセマンティクスwrtを意味します。 *パラメータ変数に割り当てる*。 –

0

これは前に何度も説明し、二回以上、これは、私はそれを説明したい方法ですされています:

(私は「内部の詳細を」光沢ことに注意してください:私は、彼らが必要とされていないことがわかります実際には、evaluation strategies usedについて議論するつもりはありませんが、Javaはcall-by-valueを使用し、オブジェクトにはcall-by-object-sharingセマンティクスが達成されていることを除いて説明します。オブジェクトの参照を値として渡して内部的に処理します。プリミティブ値は、を渡されると)

  • コピーが行われます。 (これは次の点にいくらか無関係であるが、プリミティブ値を変更することができないからである。)

  • オブジェクトが渡され(又は割り当てられる)されると、同じオブジェクトがを通過し(又は割り当てられる)さオブジェクトのコピーはありません:再割り当てされない限り、関連するパラメータ変数は、同じオブジェクト(またはnull、おそらく)と同じオブジェクトにと評価されます。 オブジェクトはそれ自体であるため、現在の "変数名"に関係なく、1つの場所でオブジェクトを変更すると、と同じオブジェクトが変化します。

私は、あなたは、1つ:)

ハッピーコーディングを作成して、新しい、独立したオブジェクトをしたいです。

関連する問題