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?
(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:
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:
Button
, la valeur sera toujours une référence à un objet de type Button
ou à une sous-classe - ou à la référence null
. ).
. 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.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:
Règles pour types de référence:
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"
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éé.
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().