JAvaはcallby value?

3878 ワード

class Chocholet{

	private int x;
	public Chocholet(int x) {this.x=x;}
	public void setX(int x) {this.x =x;}
	public int getX() {return x;}
	
}

public class ChocoMilk {

	static Chocholet chocoBar(Chocholet choco) {
		
		choco = new Chocholet(150);
		return choco;
	}
	
	
	public static void main(String[] args) {
		
		Chocholet choco = new Chocholet(1000);
		System.out.print(choco.getX() + "+");
		Chocholet checco =chocoBar(choco);
		System.out.print(choco.getX() + "+");
		System.out.print(checco.getX()+"+");
		
		choco = chocoBar(checco);
		System.out.print(choco.getX()+"+");
		System.out.print(checco.getX());

	}
}

/*출력 값
1000+1000+150+150+150 */
/* 처음에 생각한 오답
1000+150+150+150+150 */
Javaでは、関数によって生成されたオブジェクトを渡すことはできません.
JavaはValue by Call
public class ChocoMilk {
static Chocholet chocoBar(Chocholet choco) {
	
	choco = new Chocholet(150);
	return choco;
}

🤔 Call by Value? Call by Reference?


プログラミング言語のメソッドパラメータ呼び出しにはいくつかの方法があり、呼び出し方法は言語によって異なります.典型的には、C++はCall by Referenceを使用する.
(伝達パラメータの挙動であるため、値による伝達、参照による伝達とも呼ばれる)
Call by Valueは、関数パラメータを渡すときの「伝達値」です.
Call by Referenceは「アドレスを渡す方法」です.これはとても混同しやすい部分で、私が内容を整理する前に、Javaは2つの方法を混合して使っていると思っていましたが...🙄

Javaは確かに値別コールを使用しています。


Javaがどのように価値を伝えているかを見てみましょう.

💡 JavaはValue by Call


Call by Valueは「値を渡す方法」、言い換えれば「値だけを渡す方法」です!
関数Aがint変数をBからBに渡すと、その変数は、渡されたBでどのような操作が行われても変わらない.
サンプルで検証します.

method 1とmethod 2の2つの関数が存在する場合、method 1
a=10,b=5,method 2は別の値で置き換えられる.
その後method 1から再びこの変数を出力するとどうなりますか?

method 1ではa=10、b=5の値が渡され、method 2ではa=20、b=10に置き換えられる.ただし、method 2の戻りが完了すると、method 1はa=10、b=5のままです.
これはJavaがCallbyValueメソッドを使用した結果です!
では、javaのデフォルトタイプを除いて、リファレンスタイプはどのような結果を生みますか?


Javaの典型的な参照タイプStringを使用する場合、結果はintでテストした結果と同じです.
しかし、なぜJavaの呼び出し方法を混同しているのでしょうか.

💡 これは参考電話ですか?



上記のテストを少し変更し、今回は新しい宣言のクラスを使用してテストします.
予想通り、method 1のpersonフィールドの値は変更されませんか?

🤔 今回はさっきとは違う結果になりました.どうしてこんな結果になったのでしょうか.

📃 Reference Typeの動作原理正解は


上記の結果と以下の結果を一般化することができ、Javaでは、
価値に基づいて計算する方法を使用します.では、intとPersonを渡すと、
どんな違いがありますか.

Javaでは、値によるコールが実行されると、
値をコピーし、新しい領域変数に格納します.方法2
メソッド1の変数ではなく、新しく作成した領域変数を使用します.
メソッド1の変数名と変数値のコピー使用!
したがって、方法2でAとBの値を変更しても、
影響を受けない.このA、Bは名前が同じだけで、他の住所があります.
彼らは違う友达だからです.ただし、JavaがCallbyReferenceメソッドを使用する場合
AとBに影響する可能性があります.この2つは別の変数ではなく、同じアドレスなので
これは共有変数です.
これは基本的なタイプの動作原理を明確にした.ではさっきのPerson.
どうしてそんな結果になったのですか.

参照タイプがこの方法を使用しているからだ.最初の「参照タイプ」の理由は
Heap Memory領域で作成したオブジェクトのアドレス値を参照するため、「参照タイプ」と呼ばれます.
したがって,メソッド1からメソッド2に移るのはPersonのアドレス値である.
メソッド1と同じアドレス値を持つアドレス値を使用して、オブジェクトの状態を変更します.

もちろん、これは2つのPersonが参照したアドレスが同じだからです!
それに比べてmethod 2がnewキーワードを使用して新しいオブジェクトを作成し、そのアドレスを参照すると、どのような結果が予想されますか?
これは、この2つの変数が異なるアドレスでオブジェクトを参照しているためです.

📝 整理する


Value by Valueの参照方式は非常に混同されている部分です
しかし、Java生誕期のC、C++と比べると、なぜCallbyValueを使うのか
この方法が採用されているかどうかを予測する場合は、JVMを使用するには、2つの言語に共通する開発者のアドレス制御権限が制限されているため、この方法を使用しないでより安全な操作が必要であるのではないかと疑うかもしれません.