Si les arguments Java sont passés par valeur ou par référence

Pour être honnête, peu importe que vous le sachiez ou non, mais il s'agit de savoir comment transmettre les arguments Java.

Java est souvent désigné comme passant par référence, mais je n'avais pas faim et j'étais confus j'étudiais le C ++. J'ai senti que le brouillard s'était dissipé, j'ai donc écrit un article.

Encore une fois, peu importe si vous savez ou ne savez pas si vous êtes limité à Java.

Pour les types primitifs

	public static void main(String[] args) {

		int a = 1;
		int b = 2;

		System.out.println("Before swap");
		System.out.println("a = " + a);
		System.out.println("b = " + b);

		swap(a, b);

		System.out.println("After swap");
		System.out.println("a = " + a);
		System.out.println("b = " + b);
	}

	static void swap(int x, int y) {
	
		System.out.println("In swap");
	
		int t = x;

		x = y;
		y = t;

		System.out.println("x = " + x);
		System.out.println("y = " + y);
	}

production


Before swap
a = 1
b = 2
In swap
x = 2
y = 1
After swap
a = 1
b = 2

Les arguments de méthode swap `` `x``,` `y sont des copies de l'appelant ʻa,` `b et sont des entités différentes. est. Par conséquent, permuter les valeurs de x``` et y dans la méthode` `` swap n'affecte pas l'appelant.

Il s'agit de `` passer la valeur par valeur ''.

Pour les objets

	public static void main(String[] args) {

		Integer c = new Integer(1);
		Integer d = new Integer(2);

		System.out.println("Before swap");
		System.out.println("c = " + c);
		System.out.println("d = " + d);

		swap(c, d);

		System.out.println("After swap");
		System.out.println("c = " + c);
		System.out.println("d = " + d);
	}

	static void swap(Integer x, Integer y) {

		System.out.println("In swap");

		Integer t = x;

		x = y;
		y = t;

		System.out.println("x = " + x);
		System.out.println("y = " + y);
	}

production


Before swap
c = 1
d = 2
In swap
x = 2
y = 1
After swap
c = 1
d = 2

Le résultat est le même que le type primitif, même si les valeurs sont permutées dans la méthode swap '', la valeur de l'appelant n'est pas permutée. ```swap```Une référence à une instance de la classe entière est transmise à la méthode en tant qu'argument. Cependant, la référence passée à l'argument est une ** copie de la référence ** chez l'appelant, comme c'est le cas avec le type primitif. Autrement dit, même si la méthode swap``` échange les références pour x``` et y, les appelants a et `` `b La référence à est inchangée. Cela signifie que la référence est passée par valeur` ``.

Cependant, dans le cas d'un objet, la référence est passée en argument, alors n'est-il pas correct de passer la référence?

Le reste est un aparté.

Je pense que passer une référence au sens strict est probablement une référence en C ++ comme argument.

Cependant, je me souviens avoir passé l'argument par valeur et passer par référence même lorsque je mordais le langage C il y a un peu longtemps, et je pense que passer le langage C par référence et passer le pointeur comme argument. Cependant, à proprement parler, il s'agit également de passage du pointeur par valeur ''.

Pour être honnête, le contexte en langage C est ambigu, mais s'il existe un contexte de passage de `` pointeur par valeur '' par référence, même les objets Java peuvent être appelés passant par référence. Absent?

Votre propre conclusion

Strictement parlant, Java est passé par valeur. Cependant, pour dire le truc abusif, il n'est pas faux de dire qu'il est passé par renvoi.

Ce qui est vraiment important

Qu'elle soit passée par valeur ou par référence, pour Java, cette référence doit être transmise lorsqu'elle est passée à un argument d'objet.

Comme la direction de la référence est la même dans l'appelant de la méthode et dans la méthode, si l'objet est manipulé via la référence dans la méthode, l'appelant peut être affecté.

Recommended Posts

Si les arguments Java sont passés par valeur ou par référence
Comment changer les arguments dans la méthode [Java] (pour ceux qui sont confus en passant par valeur, passant par référence, passant par référence)
Récapitulatif du problème Java "Pass by Reference"
S'il faut utiliser Java Comparable ou Comparator
[Java] Le mot passant par référence est mauvais!