Que sont les classes, les références et les objects?

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:

  • une classe est comme le modèle d’une maison. En utilisant ce modèle, vous pouvez construire autant de maisons que vous le souhaitez.
  • chaque maison que vous construisez (ou instanciez dans un jargon OO) est un object , également appelé instance .
  • chaque maison a également une adresse, bien sûr. Si vous voulez dire à quelqu’un où est la maison, vous leur donnez une carte avec l’adresse inscrite dessus. Cette carte est la référence de l’object.
  • Si vous voulez visiter la maison, regardez l’adresse inscrite sur la carte. Cela s’appelle le déréférencement .

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.

  1. Plusieurs choses se passent dans la ligne 1. 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.
  2. Dans la ligne 2, vous donnez cette adresse à une autre méthode, callBar . Passons à cette méthode ensuite.
  3. Ici, nous avons une référence 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. .
  4. Dans la première méthode, nous avons déréférencé 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:

  1. Demandez à la JVM de construire une maison. Il le fait et nous donne l’adresse. Nous copions cette adresse sur une carte nommée myFoo .
  2. Nous callBar . Avant cela, nous copions l’adresse écrite sur myfoo sur une nouvelle carte, que nous donnons à callBar . Il appelle cette carte foo .
  3. 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 .
  4. Dans la première méthode, nous regardons notre carte originale, inchangée; aller à la maison dont l’adresse est sur notre carte; et faire quelque chose là-bas.

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). **/ } }