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
WBOYavant
2024-02-09 16:00:10851parcourir

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);
   } 
}

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer