Java passe par valeur et passe par référence

Type de base

Les valeurs données aux arguments des méthodes Java sont fondamentalement passées par valeur. Passer par valeur signifie que la valeur donnée à l'argument est copiée. Ainsi, si des modifications sont apportées aux arguments de la méthode, cela signifie que la copie des arguments est modifiée.

Par conséquent, vous pouvez comprendre que le mouvement est le suivant.

Le programme le plus simple pour comprendre le passage par valeur


int count = 8;
plus(count);
Log.d(count);

void plus(int value) {
    int result = value * 2;
    Log.d(result);
}

résultat


after applying plus 16
outside of method plus 8

Type de référence

Si vous passez un type de référence comme argument, la valeur de référence sera copiée.

Dans le code ci-dessous, le côté gauche est la valeur de référence et le côté droit est la valeur réelle. La valeur de référence sur le côté gauche est, par exemple, l'adresse de la mémoire où la valeur réelle sur le côté droit est stockée.

List<String> list = new ArrayList<>();

Il y a une résidence impériale à «1-1 Chiyoda, Chiyoda-ku, Tokyo». «1-1 Chiyoda, Chiyoda-ku, Tokyo» est la valeur de référence, et le palais impérial est comme la valeur réelle.

Sur la base de ce qui précède, je voudrais envisager le programme suivant.

Un programme dans lequel les changements dans une méthode sont reflétés même après l'application de la méthode


List<String> japanese = new ArrayList<>();
japanese.add("Trop");
plusElementJ(japanese);
Log.d(japanese.toString());

void plusElementJ(List<String> list) {
    list.add("Bonjour");
    Log.d(list.toString());
}

résultat


[Trop,Bonjour]
[Trop,Bonjour]

Dans le programme ci-dessus, la 12ème ligne déclare qu'il y a une résidence impériale à «1-1 Chiyoda, Chiyoda-ku, Tokyo». Transmettez l'adresse «1-1 Chiyoda, Chiyoda-ku, Tokyo» à la méthode. Dans la méthode, nous avons fait une extension à l'adresse que nous avons reçue. Ensuite, même si je sortais de la méthode, j'étais convaincu qu'il y avait un résultat de l'agrandissement du palais impérial et celui-ci en «1-1 Chiyoda, Chiyoda-ku, Tokyo».

La chaîne est également un type de référence. .. ..

Les changements de méthode ne sont pas reflétés après l'application de la méthode


String name = "Trop";
concatenate(name);
Log.d(name);

void concatenate(String name) {
    name = "Bonjour," + name;
    Log.d(name);
}

résultat


après avoir appliqué le concaténat Bonjour, trop
en dehors de la méthode concaténer aussi

String est un type de référence, mais immuable. Autrement dit, il ne peut pas être changé. Par conséquent, ce processus ne crée-t-il pas en interne un nouvel objet String comme indiqué ci-dessous?

name = new String("Bonjour,"  + name)

Par conséquent, je pense que les choses suivantes se produisent.

  1. La valeur de référence copiée «nom» reçoit une nouvelle valeur de référence
  2. Un nouvel objet est créé avec la valeur de référence à laquelle «nom» fait récemment référence.

référence

Je ne peux plus dire qu'il est passé par référence

Recommended Posts

Java passe par valeur et passe par référence
Récapitulatif du problème Java "Pass by Reference"
Si les arguments Java sont passés par valeur ou par référence
Types de données de base et types de référence (Java)
Mécanisme de référence Java (pile et tas)
A propos des types primitifs et des types de référence Java
Types de données de base et types de référence Java
Logique du numéro de page et code de référence (java)
Référence de la méthode Java8
Java et JavaScript
XXE et Java
référence de la méthode java8
Matériaux de référence JAVA
Ma référence Java
Méthode à décrire en divisant en plusieurs méthodes Comment passer des arguments Comment utiliser la valeur de retour Surcharge de méthode Passer par valeur et passer par référence
[Java] Le mot passant par référence est mauvais!
Écrivez ABNF en Java et transmettez l'adresse e-mail
Getter et Setter (Java)
[Java] Thread et exécutable
Java vrai et faux
[Java] Comparaison des chaînes de caractères et && et ||
[Java] Comment obtenir la clé et la valeur stockées dans Map par traitement itératif
Comprendre le bogue en l'implémentant et en l'analysant (1) Deadlock (Java)
Java - Sérialisation et désérialisation
[Java] Arguments et paramètres
A propos du type de données de base Java et de la mémoire du type de référence
timedatectl et Java TimeZone
[Java] Branchement et répétition
[Java] Types de variables et types
java (classe et instance)
Essayez la valeur de retour Java
[Java] Surcharge et remplacement
Introduction à Effective Java en pratiquant et en apprenant (modèle Builder)
Résolution avec Ruby, Perl et Java AtCoder ABC 113 C Reference
Comprendre le modèle Singleton en comparant le code Java et JavaScript
Recommandation de l'opération set par Java (et compréhension de equals et hashCode)
[Java] Différence entre l’affectation d’une variable de type de base et l’affectation d’une variable de type de référence
Même jugement / jugement de valeur égale / comparaison / ordre dans Swift et Java
Comprendre le modèle Iterator en comparant le code Java et JavaScript
Etudier Java # 2 (\ marque et opérateur)
[Java] Référence de classe de wrapper Integer
Type de données de base et type de référence
Référence du service Java VB.net à mi-chemin
[Java] Différence entre == et égal
Poney et fermeture de capacité de référence
[Java] Zone de pile et zone statique
[Java] Classe générique et méthode générique
Cryptage et décryptage Java PDF
Java et Iterator Part 1 External Iterator Edition
Instructions Java if et switch
Résumé orienté objet par les débutants (Java)
Apache Hadoop et Java 9 (partie 1)
[Java] À propos de String et StringBuilder
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)
[Java] HashCode et remplacement égal
☾ Instruction Java / Repeat et instruction de contrôle de répétition
Expérience de passage Java SE8 Silver
Méthodes Java et surcharges de méthodes
java Generics T et? Différence