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.
・ Par valeur ・ Passer par référence ・ Passer par valeur de référence
・ Par valeur ・ Passer par valeur de référence
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);
}
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.
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.
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");
}
// 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é
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.
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