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

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

Par exemple: ils pointent tous vers un type et ils doivent tous contenir des valeurs (à moins bien sûr que vous ayez le type null-able temporaire), mais comment 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?

(Juste pour être clair, l’explication que je donne ici est spécifique à Java et à C #. Ne supposez pas qu’elle s’applique à d’autres langages, même si certains peuvent en contenir.)

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

  • Une variable est comme un morceau de papier. Il détient une valeur, mais ce n’est pas la valeur en soi. Vous pouvez rayer ce qui existe et écrire autre chose à 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 une façon de naviguer chez moi.
  • Ma maison elle-même est comme un object. Je peux donner plusieurs références au même object, mais il n’y a qu’un seul object.

Est ce que ça aide?

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

 int x = 12; 

c’est comme avoir un morceau de papier sur lequel le numéro 12 est écrit directement. Tandis que:

 Dog myDog = new Dog(); 

n’écrit pas le contenu de l’object Chien 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 de compilation. (Par exemple, si vous avez une variable Button , la valeur sera toujours une référence à un object de type Button ou à une sous-classe – ou à la référence null .)
  • Un object est une sorte d’entité séparée. Il est important de noter que la valeur d’une variable ou de toute expression n’est jamais un object, mais uniquement une référence. Un object est constitué de:
    • Champs (l’état)
    • Une référence de type (ne peut jamais changer pendant la durée de vie de l’object)
    • Un moniteur (pour la synchronisation)
  • Une référence est une valeur utilisée pour accéder à un object, par exemple pour y appeler des méthodes, accéder à des champs, etc. Vous naviguez généralement dans la référence avec le . opérateur. Par exemple, si foo est une variable Person , foo.getAddress().getLength() prend la valeur de foo (une référence) et appelle getAddress() sur l’object auquel cette référence fait référence. Le résultat pourrait être une référence Ssortingng … nous appelons ensuite getLength() sur l’object auquel cette référence fait référence.

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


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

Règles pour les types de valeur :

  • Vous tenez dans vos arm un ballon rempli d’air. (Les variables de type valeur stockent l’object.)
  • 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 sauter son propre ballon et le tenir dans ses arm. (Dans les types de valeur, l’object 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 faire sauter celui que vous tenez déjà et en prendre un autre. (Un object de type valeur est détruit lors du remplacement.)

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

  • Vous pouvez tenir un morceau de ficelle qui mène à un ballon rempli d’hélium. (Les variables de type référence contiennent une référence à l’object.)
  • 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 prendre son propre bout 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 contenir des bouts de ficelle qui mènent tous au même ballon. (Les objects de type référence peuvent être partagés.)
  • Tant qu’il y a au moins une personne qui tient la ficelle à un ballon particulier, le ballon est en sécurité. (Un object de type référence est actif tant qu’il est accessible.)
  • Pour tout ballon particulier, si tout le monde finit par le lâcher, alors ce ballon s’envole et personne ne peut plus l’atteindre. (Un object de type référence peut devenir inaccessible à un moment donné.)
  • À un moment donné avant la fin de la partie, un ballon perdu peut apparaître tout seul à cause de la pression atmosphérique. (Les objects inaccessibles sont éligibles à la récupération de place, ce qui est non déterministe.)

Vous pouvez y penser comme une réponse aux questions.

Un object est un quoi …
C’est comme toute chose physique dans le monde, une “chose” qui est reconnaissable par elle-même et qui possède des propriétés significatives qui la distinguent des autres “choses”. Comme vous le savez, un chien est un chien car il aboie, bouge sa queue et va après une balle si vous le lancez.

Une variable est une qui …
Comme si vous surveilliez vous-même. 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 le droit. C’est-à-dire que vous pouvez avoir deux “choses” du même type / type mais que chacune peut être différente à sa manière, avoir des valeurs différentes.

Une référence est un où …
Si vous regardez deux maisons dans une rue, même si elles ont leur propre façade, vous pouvez vous rendre à chacune d’elles par leur adresse unique, ce qui signifie que si vous êtes loin, à trois rues de distance ou dans un autre pays, vous pourriez Dites l’adresse de la maison car ils seront toujours là où vous les avez laissés, même si vous ne pouvez pas les pointer 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 elle possède des propriétés uniques qui la distinguent d’une autre personne.

 &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 elle-même est la variable pour stocker les propriétés de la personne nommée “Ana”

La réponse de Jon est excellente pour l’aborder par analogie. Si un libellé plus concret 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 le suis ensuite avec une affectation, x=4 , x contient maintenant le nombre entier 4. L’essentiel est de ne pas remplacer 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 objects. Les objects sont utiles car souvent vous avez besoin d’une “chose” à référencer de nombreux endroits. Par exemple, si un document est ouvert dans un éditeur et que vous souhaitez l’envoyer à l’imprimante, il serait intéressant de ne disposer que d’un seul document, référencé à la fois par l’éditeur et par l’imprimante. Cela vous éviterait d’avoir à le copier plus de fois que vous ne le souhaiteriez.

Cependant, comme vous ne voulez pas le copier plus d’une fois, nous ne pouvons pas simplement placer un object dans une variable. Les variables conservent une valeur, donc si deux variables sont contenues dans un object, elles doivent faire deux copies, une pour chaque variable. Les références sont l’intermédiaire qui résout ce problème. Les références sont de petites valeurs faciles à copier qui peuvent être stockées dans des variables.

Donc, dans le code, lorsque vous tapez Dog dog = new Dog() , le nouvel opérateur crée un nouvel object Dog et renvoie une référence à cet object, de sorte qu’il puisse être affecté à une variable. L’atsortingbution donne ensuite à dog la valeur d’une référence à votre object nouvellement créé.

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

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