Je programme java depuis 2 ans maintenant et j’ai apparemment rencontré un problème où je ne pouvais plus comprendre et différencier la classe, la référence et un object (je ne comprends pas pourquoi j’oublie ces concepts).
Allons-y avec le problème, à savoir que je ne suis pas sûr si une classe ou une référence est la même, même si j’ai déjà une idée de ce qui est object.
Quelqu’un peut-il différencier d’une manière agréable et compréhensible ce que sont les classes, les références et les objects?
Tout ce que je sais, c’est que la classe ressemble plus à un modèle pour un object (modèle à une maison où la classe est le modèle et la maison est un object).
Si vous aimez loger des métaphores:
Vous pouvez copier cette référence autant de fois que vous le souhaitez, mais il n’ya qu’une seule maison – vous ne faites que copier la carte sur laquelle se trouve l’adresse, pas la maison elle-même. Les méthodes Java sont toujours pass-by-value, mais la valeur peut être la référence d’un object. Donc, si j’ai:
Foo myFoo = new Foo(); // 1 callBar(myFoo); // 2 myFoo.doSomething() // 4 void callBar(Foo foo) { foo = new Foo(); // 3 }
Alors voyons ce qui se passe.
new Foo()
indique à la JVM de construire une nouvelle maison en utilisant le schéma Foo
. La JVM le fait et renvoie une référence à la maison. Vous copiez ensuite cette référence dans myFoo
. Cela revient à demander à un entrepreneur de vous construire une maison. Il fait, puis vous dit l’adresse de la maison; vous écrivez cette adresse. callBar
. Passons à cette méthode ensuite. Foo foo
. Java est une valeur par callBar
, donc le foo
dans callBar
est une copie de la référence myFoo
. Pensez-y comme donner à callBar
sa propre carte avec l’adresse de la maison dessus. Que fait callBar
avec cette carte? Il demande une nouvelle maison à construire, puis utilise la carte que vous lui avez donnée pour écrire l’adresse de cette nouvelle maison. Notez que callBar
ne peut désormais pas accéder à la première maison (celle que nous avons construite à la ligne 1), mais cette maison n’a pas changé car une carte qui avait son adresse, a maintenant une autre adresse. . myFoo
pour appeler une méthode dessus ( doSomething()
). C’est comme regarder la carte, aller à la maison dont l’adresse est sur la carte, puis faire quelque chose dans cette maison. Notez que notre carte avec l’ myFoo
de myFoo
n’est pas modifiée par la méthode callBar
– rappelez-vous, nous avons donné à callBar
une copie de notre référence. La séquence entière serait quelque chose comme:
myFoo
. callBar
. Avant cela, nous copions l’adresse écrite sur myfoo
sur une nouvelle carte, que nous donnons à callBar
. Il appelle cette carte foo
. callBar
demande à la JVM une autre maison. Il le crée et renvoie l’adresse de la nouvelle maison. callBar
copie cette adresse sur la carte que nous lui avons callBar
. Lorsque vous codez, vous créez un
Instance (occurrence, copie)
d’un
Objet
d’un dit
Classe
et garder un
référence
pour cela, vous pouvez appeler ses méthodes.
En outre, certaines bases de la POO : Classes , Objet , Instance et Référence .
Dans le livre “Pensée en Java” de Bruce Eckel, il a été parfaitement décrit:
“Vous pouvez imaginer une télévision (l’object) et une télécommande (la référence). Tant que vous maintenez cette référence, vous avez une connexion à la télévision, mais quand quelqu’un dit” Changer de chaîne “ou” Inférieur le volume, “ce que vous manipulez est la référence, qui à son tour modifie l’object. Si vous voulez vous déplacer dans la pièce et contrôler toujours la télévision, vous prenez la télécommande / référence avec vous, pas la télévision.
En outre, la télécommande peut être autonome, sans télévision. C’est-à-dire que le simple fait d’avoir une référence ne signifie pas nécessairement qu’il y a un object connecté. Donc, si vous voulez tenir un mot ou une phrase, vous créez une référence de chaîne:
Ssortingng s;
Mais ici, vous n’avez créé que la référence, pas un object. Si vous avez décidé d’envoyer un message à s à ce stade, vous obtiendrez une erreur car s
n’est pas attaché à quoi que ce soit (il n’y a pas de télévision). Une pratique plus sûre consiste donc à initialiser une référence lorsque vous la créez:
Ssortingng s = "asdf";
Cependant, cela utilise une fonctionnalité Java spéciale: les chaînes peuvent être initialisées avec du texte entre guillemets. Normalement, vous devez utiliser un type d’initialisation plus général pour les objects.
Lorsque vous créez une référence, vous souhaitez la connecter à un nouvel object. Vous le faites généralement avec le nouvel opérateur. Le mot-clé new dit: «Faites-moi un nouveau de ces objects.» Ainsi, dans l’exemple précédent, vous pouvez dire:
Ssortingng s = new Ssortingng("asdf");
Non seulement cela signifie «Fais-moi une nouvelle chaîne», mais il donne également des informations sur la manière de créer la chaîne en fournissant une chaîne de caractères initiale. Bien sûr, Java est livré avec une multitude de types prêts à l’emploi en plus de Ssortingng. Plus important encore, vous pouvez créer vos propres types. En fait, la création de nouveaux types est l’activité fondamentale de la programmation Java. ”
Supposons que vous écrivez deux lignes de code:
Engine app1 = new Engine(); //LINE 1 Engine app2 = app1; //LINE 2
Dans la ligne 1, Engine est une classe , c’est un blue-print à la base.
new Engine () est l’ instance qui est faite sur le tas.
Vous faites référence à cette instance en utilisant app1 et app2 dans votre code.
Donc, app1 et app2 sont les références .
Lorsque vous créez un object, ce qui se passe derrière la scène est qu’un morceau de mémoire est réservé pour contenir cet object. Cela pourrait être n’importe où dans le grand paysage de la mémoire; c’est le système d’exploitation et le compilateur, et vous n’avez pas vraiment le contrôle ou la connaissance de l’endroit où vous vous retrouvez.
Demandez-vous, alors, comment utilisez-vous cet object si vous ne savez pas où il est en mémoire? Comment pouvez-vous en lire une valeur si vous ne savez pas où cette valeur est stockée? C’est ce que font les références pour vous. Ils sont un moyen de restr en contact avec l’object. C’est une petite corde attachée au ballon qui est une référence.
Vous utilisez la référence pour dire “Je veux toucher cet object maintenant!” Ou “Je veux lire une valeur de cet object!”.
La classe est un modèle, vous avez raison. C’est une connaissance de la structure des données. Object est cette instance de structure en mémoire. La référence est une adresse mémoire de cette instance.
Si par Object
vous vouliez dire l’identifiant Java, alors Object
est la classe de base pour toutes les classes Java complexes.
Object
est la représentation d’exécution de la définition de Class
. Et le nom avec lequel vous utilisez l’object est appelé la reference
(car il référence l’emplacement réel de l’object dans la mémoire)
Exemple
MyClass ref = new MyClass();
Ici, MyClass est (contient) la définition de la classe .
new MyClass () crée un object pour cette classe (fait uniquement pendant l’exécution, donc le représentant d’exécution)
ref est le nom que vous utilisez pour travailler sur l’object de classe, c’est la référence .
========= Classe et object ===========
Classe => ex: Personne (Plus comme l’imagination)
Objet => ex: John, Mike (Personne réelle)
=========== Référence ============
ex:
Télévision tv1; – (La télévision est une classe, tv1 est une télécommande sans télévision)
Télévision tv2 = nouvelle télévision (); – (Maintenant, la télécommande tv2 a une télévision)
tv1 = tv2; – (Maintenant, tv1 et tv2 peuvent contrôler la même télévision)
Télévision tv3 = nouvelle télévision (); – (tv3 est une nouvelle télécommande avec une nouvelle télévision)
Classe: Utilisé pour définir une entité réelle dans un environnement de programmation.
Toute entité réelle ayant au moins une property
et un behaviour
correspondant peut être considérée comme une classe. Prenons un exemple de voiture , c’est d’avoir un accelerator
propriété qui aide la voiture à se déplacer et à contrôler sa vitesse. Le comportement correspondant est l’ acceleration
, qui est directement proportionnelle à la poussée appliquée à l’accélérateur.
class Car { private Ssortingng tier; private Ssortingng tierFriction; private double weight; private double gasFedToEngine; }
La classe ci-dessus montre certaines propriétés d’une voiture, dont dépend son accélération. Comportement ( method in the class
) dépend toujours de la ou des propriétés ( global atsortingbute(s) of the class
). Maintenant, si vous voulez plus de détails, vous pouvez définir Tier
comme une autre entité, alors la définition ressemblera à
class Tier { private Ssortingng tierMaterial; private Ssortingng tierFriction; private double weight; private double tierDiameter; } class Car { private Tier tier; // getting all properties of Tier here itself private double weight; private double gasFedToEngine; }
Objet: permet de définir différentes variantes d’une entité et d’effectuer des manipulations de données séparément.
Maintenant, nous avons défini une entité pour notre programme, disons que nous avons une salle d’exposition de voitures d’occasion, ayant des voitures de différentes sociétés. Ainsi, chaque voiture devient un object
de notre entité. Les objects peuvent être Audi, Nissan, Ferrari, etc. Après l’ouverture du showroom, nous ajoutons des voitures comme ça
static List showroomCars = new ArrayList (); public boolean addCarToShowroom() { Car carNissan = new Car(); // always creates a new objects and allocates some memory in heap carNissan.setName("Nissan"); carNissan.setColor(RED); carNissan.setWeight(300); showroomCars.add(carNissan); Car carAudi = new Car(); carAudi.setName("Audi"); carAudi.setColor(BLACK); carAudi.setWeight(270); showroomCars.add(carAudi); }
Alors maintenant, deux nouvelles voitures sont ajoutées au Showroom, l’une de Nissan et l’autre d’Audi, chacune ayant ses propres valeurs d’atsortingbut.
Class
ne donne que la définition, la manipulation est effectuée sur Object
, pour faire de la manipulation sur n’importe quelle classe, l’object doit être créé. Chaque fois qu’un object est créé dans une classe, toutes ses variables non satiques (instance) seront chargées en mémoire avec leurs valeurs par défaut respectives.
Référence: Utilisé pour adresser un object
Quand on dit Car carAudi = new Car();
nous définissons un nouvel object sur Car et un emplacement de mémoire est atsortingbué à cet object. La variable de référence carAudi
contient l’adresse mémoire de cet object. L’object n’est jamais accédé directement par l’utilisateur, ni son emplacement mémoire. C’est là que la variable de référence a une signification, elle stocke le format hexadecimal
de l’emplacement de la mémoire. Si nous voulons faire des modifications sur un object, faites-le avec l’aide de la référence, pas directement.
Un object peut avoir n’importe quel nombre de référence, mais une référence ne peut pointer que sur un object à la fois.
class Car { void test() { Car car1 = new Car(); // (1) Car car2 = new Car(); // (2) car2 = car1; /** Says that car2 should point to where car1 points, so now both points to first object of Car But for this car2 has to loose its current object-(2), making it an Abandoned object (An object with no active reference from the stack). **/ } }