Cet article vous apporte des connaissances pertinentes sur java, qui présente principalement les problèmes liés au passage des paramètres des chaînes et des tableaux Java. Voyons pourquoi Java ne passe que par valeur. J'espère que cela sera utile à tout le monde.
Étude recommandée : "Tutoriel d'apprentissage Java"
La première chose à préciser est qu'il n'y a que du passage de valeur en Java ! Seule la valeur est transmise ! La base théorique vient du « think in java ». L'étape suivante consiste à expliquer en détail pourquoi Java ne transmet que par valeur.
Comme il existe deux types de données en Java : le type de base et le type de référence, plus le type spécial String, cela peut être expliqué principalement sous trois aspects.
Regardez d'abord le code
public class Demo01 { public void change(int a) { System.out.println("副本a 的初始值" + a); a = 20; System.out.println("副本a 的新值值" + a); } public static void main(String[] args) { int a = 10; Demo01 d = new Demo01(); d.change(a); System.out.println("change方法执行后的值" + a); } }
Analyse :
Les types de données de base suivent le transfert de valeur. Ainsi, lorsque l'objet d appelle la méthode change (), il transmet simplement une copie des données originales a à la méthode Pour les paramètres dans, la valeur d'origine et la valeur de la copie a sont toutes deux 10 pour la première fois. Après l'exécution de a=20, la valeur de la copie a devient 20.
Le résultat courant est donc :
Principe, reportez-vous à la figure ci-dessous
Regardez d'abord le code
public class Demo02 { char[] ch = {'a', 'b', 'c'}; public void change(char ch[]) { System.out.println("方法中ch[0]的初始值:" + ch[0]); ch[0] = 'g'; System.out.println("方法中ch[0]执行后的新值:" + ch[0]); } public static void main(String[] args) { Demo02 d = new Demo02(); System.out.println("对象d中数组的初始值是:"+d.ch); d.change(d.ch); System.out.println("对象d中数组的最终值是:"+d.ch); } }
Analyse :
Lorsque le type de référence est passé comme. un paramètre, c'est aussi une valeur En passant, ce qui est passé est une copie de la valeur de l'adresse, mais les deux adresses pointent vers le même endroit. Lorsque l'adresse de copie n'est pas modifiée, les opérations sur les données pointées par l'adresse de copie affecteront la valeur des données d'origine. Le tableau ch[] dans la méthode et le tableau ch[] d'origine pointent vers les mêmes données, donc au stade initial, ch[0] pointe vers « a », puis une nouvelle valeur est attribuée à ch[0] dans la copie ; pour devenir 'g'.
Le résultat en cours est donc :
Veuillez vous référer à l'image ci-dessous pour le principe
Regardez d'abord le code
public class Demo03 { public void change(String str2) { System.out.println("方法中str2初始值" + str2); System.out.println("方法中str2初始hashcode值" + str2.hashCode()); str2 = "bbb"; System.out.println("方法中str2赋值后:" + str2); System.out.println("方法中str2赋值后hashcode值:" + str2.hashCode()); } public static void main(String[] args) { String str1 = new String("aaa"); System.out.println("原始字符串str1的hashcode值:" + str1.hashCode()); Demo03 d = new Demo03(); d.change(str1); System.out.println("方法调用后str1的值" + str1); } }
Analyse :
La chaîne est spéciale. type de données, sa couche inférieure est un tableau char[] final, qui ne peut pas être modifié, donc lorsque la chaîne est passée en paramètre, elle peut être utilisée comme un tableau spécial, de la même manière, elle copie également l'objet d'origine. référence à la copie. De cette façon, lorsque la référence de l'objet de copie et la référence de l'objet d'origine pointent toutes deux vers l'emplacement de la chaîne d'origine, c'est-à-dire lorsque str2 est initialisé pour la première fois, l'adresse vers laquelle il pointe est cohérente avec l'emplacement. pointé par l'objet d'origine str1, c'est-à-dire que la valeur de hashcode initiale de str2 est la même que celle de l'objet d'origine str1. La valeur de hashcode est la même après que str2 soit utilisé avec str2="bbb", en raison de l'immuabilité de. la chaîne str2 pointera vers une nouvelle référence d'objet, c'est-à-dire que str2 pointera vers la position de "bbb". La valeur du hashcode de str2 changera, mais la référence d'objet d'origine de str1 n'a pas changé et "aaa" n'a pas changé, donc str1 pointe toujours vers "aaa". Les résultats d'exécution sont les suivants :
Ensuite, regardez un exemple de chaîne plus spécifique :public class Demo04 { public static void main(String[] args) { StringBuffer s = new StringBuffer("hello"); StringBuffer s2 = new StringBuffer("hi"); test(s, s2); System.out.println("方法調用后s的值:" + s); System.out.println("方法調用后s2的值:" + s2); } static void test(StringBuffer s3, StringBuffer s4) { System.out.println("方法初始化時s3的值" + s3); System.out.println("方法初始化時s4的值" + s4); s4 = s3; s3 = new StringBuffer("new"); System.out.println("第一步变化后s3的值" + s3); System.out.println("第一步变化后s4的值" + s4); s3.append("boy"); s4.append("gril"); System.out.println("第二步变化后s3的值" + s3); System.out.println("第二步变化后s4的值" + s4); } }
(4) À ce stade, l'appel de méthode est terminé. Revenons en arrière et passons en revue l'impact de s3s4 sur s1s2 dans le processus.
——- A. Tout d'abord, s3 commence à pointer vers "bonjour" comme s1, puis crée une nouvelle référence d'objet "nouveau" pour s3. À ce stade, s3 et s1 n'ont plus de relation d'un demi-cent, et s3. performs append (boy) Enfin, s3 = "newboy" ;
——– B. s4 et s2 pointent tous deux vers "salut" au début, puis s3 donne sa valeur initiale (c'est-à-dire une copie de s1) à s4. . À ce moment-là, s4 pointe vers "bonjour" (cela créera une relation entre s4 et s1), s4 effectue l'opération d'ajout (grill), car lui et s1 pointent vers le même emplacement, donc les objets vers lesquels ils pointent conjointement le feront. changement, s4=s1="hellogrill".
——- C. Ensuite, il devient clair que l'objet "hi" pointé par s2 n'a pas changé, et le "hello" pointé par s1 est devenu "hellogril" sous l'opération append ("grill").
Lors de l'utilisation de types de données de base comme paramètres formels d'une méthode, les modifications apportées aux paramètres formels dans le corps de la méthode n'affecteront pas les valeurs des paramètres réels
Lors de l'utilisation de types de données de référence comme les paramètres formels de la méthode, si vous modifiez le contenu des données pointé par le paramètre formel dans le corps de la méthode, cela affectera la valeur de la variable paramètre réelle, car la variable paramètre formelle et la variable paramètre réelle partagent la même zone de tas ;
Lors de l'utilisation de types de données de référence Lorsqu'il est utilisé comme paramètre formel d'une méthode, si la direction de la variable du paramètre formel est modifiée dans le corps de la méthode, cela n'affectera pas la valeur de la variable du paramètre formel. Par conséquent, la variable du paramètre formel. la variable de paramètre et la variable de paramètre réelle pointent respectivement vers différentes zones de tas ; les derniers exemples sont l'explication la plus frappante.
Concernant les paramètres de chaîne, cela dépend aussi si son pointage de variable de paramètre a changé, car la couche inférieure de String est un type final char[]. Lorsque vous utilisez String s = "aaa" ou String s = new String ( "aaa"), une nouvelle référence d'objet sera créée pour s. Cependant, lorsque la méthode append() est appelée, elle ne pointera pas vers un nouvel objet, mais modifiera l'objet pointé d'origine, et la référence d'objet partagée avec elle changera également.
La dernière chose répétée est qu'il n'y a pas de transfert de référence en Java, seulement un transfert de valeur. Le type référence est un transfert de valeur spécial (une copie de son adresse est donnée au paramètre, mais elle est différente des données de base. type. Si l'objet pointé par l'adresse change, l'objet d'origine changera également pour des raisons de partage).
Apprentissage recommandé : "Tutoriel Java"
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!