Maison > Java > javaDidacticiel > Comment obtenir un effet de passage par référence pour les primitives en Java ?

Comment obtenir un effet de passage par référence pour les primitives en Java ?

Mary-Kate Olsen
Libérer: 2024-11-12 22:15:03
original
995 Les gens l'ont consulté

How Do You Achieve a Pass-by-Reference Effect for Primitives in Java?

L'équivalent Java du passage par référence pour les primitives

En C, le passage par référence permet aux fonctions de modifier des variables en dehors de leur portée. Java, cependant, fonctionne par transmission de valeur, ce qui rend difficile l'obtention du même effet pour les primitives.

Considérez le code suivant :

public class XYZ {
    public static void main(String[] args) {
        int toyNumber = 5;
        XYZ temp = new XYZ();
        temp.play(toyNumber);
        System.out.println("Toy number in main " + toyNumber);
    }

    void play(int toyNumber) {
        System.out.println("Toy number in play " + toyNumber);
        toyNumber++;
        System.out.println("Toy number in play after increment " + toyNumber);
    }
}
Copier après la connexion

Ce code entraînera :

Toy number in play 5
Toy number in play after increment 6
Toy number in main 5
Copier après la connexion

Contrairement à C , les modifications apportées à toyNumber dans play() n'affectent pas sa valeur dans main(). En effet, Java transmet les valeurs primitives par copie et non par référence.

Approches alternatives

1. Utilisez un Object Wrapper :

Une approche consiste à envelopper la primitive dans un objet et à transmettre l'objet par référence :

class ToyNumber {
    int toyNumber;
}
Copier après la connexion
public static void main(String[] args) {
    ToyNumber toyNumber = new ToyNumber(5);
    XYZ temp = new XYZ();
    temp.play(toyNumber);
    System.out.println("Toy number in main " + toyNumber.toyNumber);
}
Copier après la connexion
void play(ToyNumber toyNumber) {
    System.out.println("Toy number in play " + toyNumber.toyNumber);
    toyNumber.toyNumber++;
    System.out.println("Toy number in play after increment " + toyNumber.toyNumber);
}
Copier après la connexion

Cette méthode permet les modifications apportées dans play() doivent être reflétées dans main(). Cependant, cela introduit une surcharge supplémentaire en créant un objet.

2. Renvoyer la valeur :

Une autre option consiste à renvoyer la valeur modifiée :

int play(int toyNumber) {
    ...
    return toyNumber;
}
Copier après la connexion
public static void main(String[] args) {
    int toyNumber = 5;
    toyNumber = temp.play(toyNumber);
    System.out.println("Toy number in main " + toyNumber);
}
Copier après la connexion

Cette approche fonctionne mais nécessite de changer le site d'appel pour recevoir la valeur de retour.

3. Variables statiques ou de classe :

Si play() et main() se trouvent dans la même classe ou instance de classe, envisagez d'utiliser une variable statique ou de classe :

class XYZ {
    static int toyNumber = 5;
    ...
}
Copier après la connexion
public static void main(String[] args) {
    XYZ.play();
    System.out.println("Toy number in main " + XYZ.toyNumber);
}
Copier après la connexion
static void play() {
    ...
    XYZ.toyNumber++;
    ...
}
Copier après la connexion

Cette méthode permet aux deux fonctions de modifier la même variable, mais elle peut entraîner des problèmes de concurrence et n'est pas recommandée pour les applications multithread.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal