English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Copiez d'abord une interview/Question d'entretien :
Quand un objet est passé comme paramètre à une méthode, cette méthode peut modifier les propriétés de cet objet et peut renvoyer le résultat modifié, alors est-ce une transmission de valeur ou une transmission de référence ?
Réponse :
C'est une transmission de valeur. Les appels de méthode en Java ne supportent que la transmission de valeur. Lorsqu'une instance d'objet est passée comme paramètre à une méthode, la valeur du paramètre est une référence à cet objet. Les propriétés de l'objet peuvent être modifiées pendant l'appel, mais les modifications de la référence à l'objet n'affectent pas l'appelant.++Il est possible de modifier la valeur des paramètres passés par référence ou par retour de valeur en C#. Voici un exemple de code en C# qui ne peut pas être réalisé en Java.
Transmission par valeur et par adresse dans Java (transmission par référence), pour comprendre ces deux concepts, il faut comprendre la transmission par valeur et par adresse.
Voici un exemple simple pour illustrer :
Par exemple, si vous voyagez à l'étranger et que vous prenez une photo exceptionnelle, que vous souhaitez partager avec vos amis, il y a deux façons de le faire. Le premier est de envoyer directement cette photo à vos amis, c'est-à-dire de donner à vos amis une copie de cette photo. Le second est de télécharger cette photo exceptionnelle sur QQ (Weibo) ou un autre site, vous obtiendrez alors une adresse d'accès à cette photo (URL), puis vous pouvez partager cette URL avec vos amis.
Comme dans l'exemple ci-dessus, le premier peut être considéré comme une transmission par valeur, et le second peut être considéré comme une transmission par adresse (transmission par référence). Une fois que vous comprenez ces concepts, vous pouvez procéder à une analyse simple.
Transmission par valeur :Java utilise cette stratégie de transmission uniquement lorsque le paramètre est une variable de type de base.
Si vous partagez une photo, l'ami reçoit une copie de la photo, alors les modifications apportées par l'ami à la photo ne vous affectent pas, et vos modifications de la photo ne vous affectent pas non plus la photo que vous avez partagée avec l'ami.
Transmission par adresse :Java utilise cette stratégie de transmission uniquement lorsque le paramètre est une variable de type de référence.
Si vous donnez cette adresse URL à un ami, alors si l'ami a également le droit de modifier, l'opération de l'ami sur la photo, l'image que vous consultez est le résultat de l'opération de l'ami.
Voici comment expliquer cet exemple par le code :
package com.dufy.reforvalue; import java.util.Arrays; /** * Transmission par valeur et par adresse dans Java * Transmission par valeur : variables de type de base-Transmission par valeur, la transmission par valeur consiste à obtenir une copie des paramètres par copie * Transmission par adresse : variables de type de référence-Transmission par adresse, la transmission par adresse passe par l'adresse de référence de l'objet * * @auteur dufy * @creation 2017Année2Mois9Jour */ public class ReferenceOrValue { /** * Types de base, transmission par valeur * Par exemple : partager une photo avec un ami, l'ami reçoit une copie réelle de la photo que vous avez partagée, * Vous et vos amis pouvez effectuer des opérations sur vos propres photos sans affecter celles des autres ! */ public static void testVal(int photo){ photo++;//L'ami modifie la photo System.out.println("Mon ami voit la photo = " + photo); } /** * photo.getPhoto()); * Par exemple : partager une photo avec un ami, ce que vous partagez est l'URL (adresse) d'une photo que vous avez téléchargée sur Internet, * Vous et vos amis pouvez accéder aux photos à cette adresse et effectuer une opération sur la photo ! */ public static void testRef(Photo photo){ photo.setPhoto("java Photo,Great!");//朋友对你的照片进行修改 System.out.println("Mon ami voit la photo = " + Votre ami modifie votre photo } /** * photo.getPhoto()); * Les types de référence : transmission par adresse */ public static void testArrayRef(int[] array){ for (int i = 0; i < array.length; i++) { array[i] = 0; } System.out.println("testArrayRef array is = "+Arrays.toString(array))); } public static void main(String[] args) { //Un : transmission par valeur int photo = 10;//Définissez la photo à envoyer testVal(photo);//Envoyez la photo à votre ami, votre ami obtient une copie System.out.println("Je vois la photo = " + photo); //Deux : transmission par adresse Photo p = new Photo();//Définissez un objet photo, une photo que j'ai prise java photo p.setPhoto("java photo"); testRef(p);//Envoyez l'objet photo (c'est-à-dire l'adresse URL) à votre ami, votre ami doit obtenir une URL (adresse), l'URL ouverte est la photo System.out.println("Mon ami voit la photo = " + p.getPhoto()); //Trois : les tableaux sont des objets, les tableaux sont dans la pile mémoire. Les références sont dans le tas. int array[] = {1,2,3,4,5}; testArrayRef(array); System.out.println("array is = "+Arrays.toString(array))); } /** * Classe de photo */ static class Photo{ String photo; public String getPhoto() { return photo; } public void setPhoto(String photo) { this.photo = photo; } } }
Le résultat de la sortie est le suivant :
Mon ami voit la photo = 11
Je vois la photo = 10
Mon ami voit la photo = java Photo, génial !
Mon ami voit la photo = java Photo, génial !
l'array testArrayRef est = [0, 0, 0, 0, 0]
array is = [0, 0, 0, 0, 0]
Petite digression : voici une question : comment doit-on écrire cette méthode ?
public static void main(String[] args) { int a = 10; int b = 20; method(a,b);//Il faut que la méthode method soit appelée après l'appel, et uniquement afficher a=100,b=200, écrivez la méthode method(a,b) ! System.out.println("a = ", + a); System.out.println("b = ", + b); }
Beaucoup de gens, comme moi auparavant, écrivent sans réfléchir le code suivant :
private static void method(int a, int b) { a*=10; b*=10; }
Mais après l'exécution, vous découvrirez que le résultat souhaité n'a pas été affiché !
Si vous regardez attentivement la présentation ci-dessus, il ne devrait pas être difficile de comprendre pourquoi il se produit de tels résultats !
Voici les résultats possibles pour cette question :
private static void method(int a, int b) { System.out.println("a=",100,b=200"); System.exit(0); }
Ce que j'ai décrit ci-dessus est ce que l'éditeur vous présente sur le passage de Java par valeur et par adresse (fréquemment posé en entretien), j'espère que cela vous sera utile. Si vous avez des questions, n'hésitez pas à laisser un message, l'éditeur vous répondra à temps. Je tiens également à remercier vivement le soutien de chacun à notre site Web de tutoriels d'extinction !
Déclaration : Le contenu de cet article est recueilli sur Internet, propriété des auteurs respectifs, le contenu est apporté par les utilisateurs d'Internet de manière volontaire et téléversé, ce site n'a pas de propriété, n'a pas été traité par l'éditeur humain et n'assume pas de responsabilité juridique. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (au moment de l'envoi d'un e-mail, veuillez remplacer # par @ pour signaler une fraude, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)