Maison > Java > Pourquoi une String passée par référence ne change-t-elle pas sa valeur ?

Pourquoi une String passée par référence ne change-t-elle pas sa valeur ?

WBOY
Libérer: 2024-02-09 16:00:10
avant
854 Les gens l'ont consulté

En PHP, les chaînes sont immuables. Cela signifie qu'une fois qu'une chaîne est créée, sa valeur ne peut plus être modifiée. Lorsque nous transmettons une chaîne par référence, nous transmettons en fait une copie de la chaîne plutôt que la chaîne d'origine elle-même. Par conséquent, toute modification apportée à la copie n’affectera pas la valeur de la chaîne d’origine. Il s'agit d'un mécanisme de protection conçu par PHP pour garantir l'immuabilité des chaînes et la sécurité des données. Ainsi, peu importe la façon dont nous essayons de modifier la valeur d'une chaîne par référence, nous créons en fait une nouvelle chaîne et l'attribuons à la variable de référence, tandis que la valeur de la chaîne d'origine reste inchangée.

Contenu de la question

Pourquoi le code suivant modifie-t-il uniquement la valeur du tableau t 中的值,并且不更改字符串 s ? Je m'attendais à ce que la chaîne change également en raison de ses propriétés d'objet.

class A {
    private int i = 0;
    private String s = "";
    private int[] t = new int[1];

    void m() {
        B.m(i, s, t);
    }

    @Override
    public String toString() {
        return "i=" + i + ", s=" + s + ", t[0]=" + t[0];
    }
}

class B{
   public static void m(int i, String s, int[] t){
      i += 1;
      s += "1";
      t[0] += 1;
   }  
}

public class Zad {

   public static void main( String [ ] args ){
      A a = new A() ;
      System.out.println(a);
      a.m();
      System.out.println(a);
   } 
}
Copier après la connexion

Solution de contournement

Voici ce qui se passe dans votre code : en Java, lorsque vous transmettez un type primitif (comme int) à une méthode, vous transmettez la valeur elle-même. Toute modification apportée aux paramètres au sein de la méthode n'affectera pas les valeurs d'origine en dehors de la méthode. C'est ce qu'on appelle le "passage par valeur". Vous le savez probablement déjà.

Variables locales en classe b 的定义中,ist 是方法 m(). Cela signifie que les modifications apportées à ces variables n'affectent pas les valeurs d'origine dans le code appelant.

Lorsque vous appelez une méthode d'instance a.m(); dans la méthode principale :

A a = new A();
System.out.println(a);  // Output: i=0, s=, t[0]=0
a.m();
System.out.println(a);  // Output: i=0, s=, t[0]=1
Copier après la connexion

Vous verrez t[0] 的值已更改,因为 java 中的数组是对象,对其元素的修改会反映在方法外部。但是,is 的值保持不变,因为它们是原始类型或不可变对象(如 string) et toutes les modifications qui y sont apportées dans la méthode sont locales et n'affecteront pas la valeur d'origine.

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:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal