[Java] Le mot passant par référence est mauvais!

Toujours trébucher la valeur de référence Java en passant

J'entends souvent que le passage par référence n'existe pas en Java. Au début, j'ai pensé "Eh", mais j'ai résumé les résultats de mes recherches.

Comment passer des arguments de méthode générale

・ Par valeur ・ Passer par référence ・ Passer par valeur de référence

Comment passer des arguments de méthode en Java

・ Par valeur ・ Passer par valeur de référence

Exemple de passage par valeur

RefValHandOver.java


private static void editNumber(int arg){
	arg = 0;
	System.out.println("editNumber : " + arg);
}
public static void main(String[] args) {
	int number = 100;
	editNumber(number);
	System.out.println( "main : " + number);
}

résultat

editNumber : 0
main : 100

Il vaut 0 dans editNumber, mais il reste 100 dans main. Si l'argument est de type primitif, il sera passé par valeur.

Type primitif

Moule bit valeur initiale
boolean 1bit false
byte 8bit 0
char 16bit \u0000
short 16bit 0
int 32bit 0
float 32bit 0.0
long 64bit 0
double 64bit 0.0

Il n'y a pas de problème particulier pour l'instant.

Exemple de passage par valeur de référence

Je vais l'expliquer en le classant en trois modèles. ・ 1. Lorsque les données sont manipulées dans la méthode ・ 2. Renouvelez la méthode. -3. Remplacez null dans la méthode.

RefValHandOver.java


// 1.Lorsque les données sont manipulées dans une méthode
private static void methodAddArray(ArrayList<String> arg){
	arg.add("B");
	System.out.println("methodAddArray : " + arg.hashCode() + " : " + arg.toString());
}
//2.Renouvelez la méthode.
private static void methodNewArray(ArrayList<String> arg){
	arg = new ArrayList<String>();
	arg.add("C");
	System.out.println("methodNewArray : " +arg.hashCode() + " : " +  arg.toString());
}
//3.Attribuez null dans la méthode.
private static void methodNullArray(ArrayList<String> arg){
	arg = null;
	System.out.println((arg != null) ? "methodNullArray : " + arg.hashCode() + " : " +  arg.toString() : "null");
}

public static void main(String[] args) {
	ArrayList<String> arrayList = new ArrayList<String>() {{add("A");}};
	// 1.Lorsque les données sont manipulées dans une méthode
	methodAddArray(arrayList);
	System.out.println("main : " + arrayList.hashCode() + " : " +  arrayList.toString());

	//2.Renouvelez la méthode.
	methodNewArray(arrayList);
	System.out.println("main : " + arrayList.hashCode() + " : " +  arrayList.toString());

	//3.Attribuez null dans la méthode.
	methodNullArray(arrayList);
	System.out.println((arrayList != null) ? "main : " + arrayList.hashCode() + " : " +  arrayList.toString() : "null");

}

résultat

// 1.Lorsque les données sont manipulées dans une méthode
methodAddArray : 3042 : [A, B]
main : 3042 : [A, B]       //La destination de référence n'a pas changé

//2.Renouvelez la méthode.
methodNewArray : 98 : [C]
main : 3042 : [A, B]       //La destination de référence a changé

//3.Attribuez null dans la méthode.
methodNullArray : null
main : 3042 : [A, B]       //La destination de référence a changé

Essayez d'illustrer

参照値渡し.png

Je vais expliquer

L'objectif est de savoir si vous ___assignez une nouvelle référence à l'argument. Lorsqu'ils sont affectés, la "variable locale dans main" et "l'argument dans la méthode" seront différents.

Résumé

Nous avons décrit ___ passé par valeur ___ et ___ passé par référence ___. Personnellement, je pense qu'il serait plus facile de comprendre si le passage par valeur de référence est ___ passant par l'adresse de référence ___ </ span>.

Recommended Posts

[Java] Le mot passant par référence est mauvais!
L'histoire de ne pas connaître le comportement de String en passant par Java
5ème jour de Java
Où est le fuseau horaire de Java LocalDateTime.now ()?
Java passe par valeur et passe par référence
Récapitulatif du problème Java "Pass by Reference"
Référence Java à comprendre dans la figure
Quelle est la meilleure lecture de fichier (Java)
Quelle est la méthode principale en Java?
L'API de sécurité Java EE est là!
L'histoire reçue par Java SE11 silver
Qu'est-ce que le modèle Java Servlet / JSP MVC?
Le type d'intersection introduit dans Java 10 est incroyable (?)
Que signifie passer des paramètres de fonction par référence?
[Java] Jugement en saisissant des caractères dans le terminal
[Java] Quelque chose est affiché comme "-0.0" dans la sortie
Qu'est-ce que 'java
Référence de la méthode Java8
Qu'est-ce que Java <>?
Qu'est-ce que 'java
Apprenez la signification de «transmettre le PATH» en créant un environnement de développement Java sur Mac
référence de la méthode java8
Matériaux de référence JAVA
Ma référence Java
Lire la capture de paquets obtenue par tcpdump avec Java
La comparaison d'énumération est ==, et equals est bonne [Java]
[JUnit 5] Traiter de "la référence d'assertEquals est ambiguë"
Quel est le meilleur, Kotlin ou futur Java?
Si les arguments Java sont passés par valeur ou par référence
Informations d'identification référencées par le kit AWS SDK for Java par défaut
L'histoire que .java est également construite dans Unity 2018