Maison > Java > javaDidacticiel > le corps du texte

Comment puis-je obtenir un comportement de passage par référence en Java, malgré sa nature de passage par valeur ?

Patricia Arquette
Libérer: 2024-11-07 11:21:03
original
773 Les gens l'ont consulté

How can I achieve pass-by-reference behavior in Java, despite its pass-by-value nature?

Passage par référence ou valeur en Java

Java est un langage de passage par valeur, ce qui signifie que lorsque des arguments sont transmis à des méthodes , des copies des variables d'origine sont créées. Cela garantit l’intégrité des données et empêche toute modification involontaire. Cependant, il existe des scénarios où il peut être souhaitable de modifier les variables d'origine au lieu des copies.

Pass by Reference Equivalent en Java

En C, passez par référence permet aux variables d'être transmises par leur adresse mémoire, permettant ainsi de modifier les valeurs d'origine. Bien que Java ne dispose pas d'un mécanisme de passage par référence explicite, il existe plusieurs techniques qui peuvent obtenir un effet similaire :

1. Variable membre de classe :

Si la variable est un membre de classe, vous pouvez transmettre une instance de la classe à une méthode. Les modifications apportées à la variable membre dans la méthode seront reflétées dans l'objet d'origine.

2. Renvoi de la valeur modifiée :

Au lieu de passer par référence, vous pouvez modifier la valeur et la renvoyer depuis la méthode. L'appelant peut ensuite attribuer la valeur modifiée à la variable d'origine.

3. Classe ou variable statique :

Si la variable est déclarée comme une classe ou une variable statique, elle est accessible et modifiée globalement, y compris au sein des méthodes.

4. Array Trick :

Vous pouvez créer un tableau à un seul élément et le transmettre comme argument. Les modifications apportées à l'élément du tableau dans la méthode modifieront effectivement la valeur de la variable d'origine.

Exemple :

Considérez l'extrait de code Java suivant, où nous voulons modifier la variable toyNumber passée à la méthode play() :

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

En utilisant l'une des techniques décrites ci-dessus, nous pouvons obtenir le résultat souhaité, où la variable toyNumber d'origine dans main() est modifiée :

Choix 1 (Variable de membre de classe) :

class Toy {
    int toyNumber;
}

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

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

Choix 2 (Renvoi de la valeur modifiée) :

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

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

Choix 3 (Classe ou variable statique) :

class XYZ {
    static int toyNumber = 5;

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

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

Choix 4 (Array Trick) :

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[0]);
    }

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

Conclusion :

Bien que Java soit un langage de passage par valeur, plusieurs techniques peuvent être utilisées pour obtenir un comportement de type passage par référence. Le choix de la technique dépend du scénario et des exigences spécifiques.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!