web-dev-qa-db-fra.com

Quelle est la différence entre une variable, un objet et une référence?

Quelles sont exactement les différences entre variables, objets, et références?

Par exemple: ils pointent tous sur un type et ils doivent tous contenir des valeurs (à moins que vous n'ayez bien sûr le type temporairement nul), mais en quoi leurs fonctions et leurs implémentations sont-elles différentes les unes des autres?

Exemple:

Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog
int x = 12; //variable x that hold a value of 12

Ils ont les mêmes concepts, mais en quoi sont-ils différents?

68
user5217533

(Juste pour être clair, l'explication que je donne ici est spécifique à Java et C #. Ne supposez pas que cela s'applique à d'autres langages, même si des fragments peuvent en être la cause.)

J'aime utiliser une analogie consistant à dire à quelqu'un où je vis. Je pourrais écrire mon adresse sur un morceau de papier:

  • Une variable est comme un morceau de papier. Il contient une valeur, mais ce n'est pas la valeur en soi. Vous pouvez rayer tout ce qui est là et écrire quelque chose d'autre à la place.
  • L'adresse que j'écris sur le papier est comme une référence. Ce n'est pas ma maison, mais c'est un moyen de naviguer chez moi.
  • Ma maison elle-même est comme un objet. Je peux donner plusieurs références au même objet, mais il n'y a qu'un seul objet.

Est ce que ça aide?

La différence entre un type de valeur et un type de référence correspond à ce qui est écrit sur le morceau de papier. Par exemple, ici:

int x = 12;

est comme avoir un morceau de papier avec le nombre 12 écrit directement dessus. Tandis que:

Dog myDog = new Dog();

n'écrit pas l'objet Dog contenu lui-même sur le morceau de papier - il crée un nouveau Dog, puis écrit une référence au chien sur ce papier.

En termes non analogiques:

  • Une variable représente un emplacement de stockage en mémoire. Il a un nom par lequel vous pouvez vous y référer au moment de la compilation, et au moment de l'exécution, il a une valeur, qui sera toujours compatible avec son type au moment de la compilation. (Par exemple, si vous avez une variable Button, la valeur sera toujours une référence à un objet de type Button ou à une sous-classe - ou à la référence null. )
  • Un objet est une sorte d'entité séparée. Il est important de noter que la valeur d'une variable ou de toute expression est jamais un objet, uniquement une référence. Un objet consiste effectivement en:
    • Champs (l'état)
    • Une référence de type (ne peut jamais changer pendant la durée de vie de l'objet)
    • Un moniteur (pour la synchronisation)
  • Une référence est une valeur utilisée pour accéder à un objet - par exemple. pour y appeler des méthodes, des champs d'accès, etc. Vous naviguez généralement dans la référence avec l'opérateur .. Par exemple, si foo est une variable Person, foo.getAddress().getLength() prendrait la valeur de foo (une référence) et appellerait getAddress() le l'objet auquel cette référence fait référence. Le résultat pourrait être une référence String ... nous appelons ensuite getLength() sur l'objet auquel référence that référence.
150
Jon Skeet

J'utilise souvent l'analogie suivante pour expliquer ces concepts.


Imaginez qu'un objet est un ballon. Une variable est une personne. Chaque personne est soit dans l’équipe type de valeur, soit dans l’équipe type de référence. Et ils jouent tous un petit jeu avec les règles suivantes:

Règles pour types de valeur:

  • Vous tenez dans vos bras un ballon rempli d'air. (Les variables de type valeur stockent l'objet.)
  • Vous devez toujours tenir exactement un ballon. (Les types de valeur ne sont pas nullables.)
  • Lorsque quelqu'un d'autre veut votre ballon, il peut faire exploser son ballon identique et le tenir dans ses bras. (Dans les types valeur, l'objet est copié.)
  • Deux personnes ne peuvent pas tenir le même ballon. (Les types de valeur ne sont pas partagés.)
  • Si vous voulez tenir un ballon différent, vous devez sauter celui que vous tenez déjà et en prendre un autre. (Un objet de type valeur est détruit lors de son remplacement.)

Règles pour types de référence:

  • Vous pouvez tenir un bout de ficelle qui mène à un ballon rempli d'hélium. (Les variables de type référence stockent une référence à l'objet.)
  • Vous êtes autorisé à tenir un morceau de ficelle, ou aucun morceau de ficelle du tout. (Les variables de type référence sont nullables.)
  • Lorsque quelqu'un d'autre veut votre ballon, il peut se procurer son propre morceau de ficelle et l'attacher au même ballon que vous. (Dans les types de référence, la référence est copiée.)
  • Plusieurs personnes peuvent tenir des bouts de ficelle qui mènent tous au même ballon. (Les objets de type référence peuvent être partagés.)
  • Tant qu'il y a au moins une personne qui tient encore la ficelle d'un ballon particulier, le ballon est en sécurité. (Un objet de type référence est en vie tant qu'il est accessible.)
  • Pour un ballon en particulier, si tout le monde le lâche, alors ce ballon s'envole et personne ne peut plus l'atteindre. (Un objet de type référence peut devenir inaccessible à un moment donné.)
  • Plus tard, avant la fin de la partie, un ballon perdu peut éclater de lui-même à cause de la pression atmosphérique. (Les objets inaccessibles sont éligibles pour la récupération de place, ce qui est non déterministe.)
29

Vous pouvez y voir une réponse à une question.

n objet est un quoi ...
C'est comme n'importe quelle chose physique au monde, une "chose" qui est reconnaissable par elle-même et qui possède des propriétés significatives qui la distingue des autres "choses". Comme vous le savez, un chien est un chien parce qu'il aboie, bougez sa queue et cherchez une balle si vous la lancez.

ne variable est un qui ...
Comme si vous surveilliez vos propres mains. Chacun est une main elle-même. Ils ont des doigts, des ongles et des os dans la peau, mais vous savez que l’un est votre main gauche et l’autre, la droite. C'est-à-dire que vous pouvez avoir deux "choses" du même type/genre mais que chacune peut être différente à sa manière, peut avoir des valeurs différentes.

ne référence est un où ...
Si vous regardez deux maisons dans une rue, bien qu’elles aient leur propre façade, vous pouvez accéder à chacune d’elles par leur adresse unique, ce qui signifie que si vous êtes loin, trois rues plus loin ou plus loin. Dans un autre pays, vous pouvez indiquer l’adresse de la maison car ils seront toujours là où vous les avez laissés, même si vous ne pouvez pas les indiquer directement.

Maintenant, pour la programmation, des exemples de manière C++

class Person{...}
Person Ana = new Person(); //An object is an instance of a class(normally)

C'est-à-dire qu'Ana est une personne mais qu'elle possède des propriétés uniques qui la distinguent des autres.

&Ana //This is a reference to Ana, that is to say, a "where" does the variable 
     //"Ana" is stored, wether or not you know it's value(s)

Ana lui-même est la variable pour stocker les propriétés de la personne nommée "Ana"

7
Edgar Sampere

La réponse de Jon est excellente pour l'aborder par analogie. Si une formulation plus concrète vous est utile, je peux intervenir.

Commençons par une variable. Une variable est une chose [nommée] qui contient une valeur. Par exemple, int x = 3 Définit une variable nommée x, qui contient le nombre entier 3. Si je lui donne ensuite une affectation, x=4, X contient maintenant le nombre entier 4. L'important est que nous n'avons pas remplacé la variable. Nous n'avons pas de nouvelle "variable x dont la valeur est maintenant 4", nous avons simplement remplacé la valeur de x par une nouvelle valeur.

Passons maintenant aux objets. Les objets sont utiles car il faut souvent une "chose" référencée à plusieurs endroits. Par exemple, si un document est ouvert dans un éditeur et que vous souhaitez l'envoyer à l'imprimante, il serait agréable de n'avoir qu'un seul document, référencé à la fois par l'éditeur et par l'imprimante. Cela vous éviterait de le copier plus de fois que vous le souhaiteriez.

Cependant, comme vous ne voulez pas le copier plus d'une fois, nous ne pouvons pas simplement mettre un objet dans une variable. Les variables conservent une valeur. Par conséquent, si deux variables sont associées à un objet, elles doivent en faire deux copies, une pour chaque variable. Les références sont les intermédiaires qui résolvent ceci. Les références sont de petites valeurs faciles à copier qui peuvent être stockées dans des variables.

Ainsi, dans le code, lorsque vous tapez Dog dog = new Dog(), l'opérateur new crée un nouvel objet Dog et renvoie une référence à cet objet afin qu'il puisse être affecté à une variable. L'affectation donne ensuite à dog la valeur d'une référence à votre nouvel objet créé.

6
Cort Ammon

new Dog () va instancier un objet Dog ie) il va créer une mémoire pour cet objet. Vous devez accéder à la variable pour manipuler certaines opérations. Pour cela, vous avez besoin d'une référence qui soit Dog myDog. Si vous essayez d'imprimer l'objet, il imprimera une valeur non lisible qui n'est autre que l'adresse.

      myDog -------> new Dog().
3
Shriram