web-dev-qa-db-fra.com

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

Je programme Java depuis 2 ans maintenant, et apparemment, j'ai rencontré un problème qui empêchait de comprendre et de différencier une classe, une référence et un objet (je ne comprends pas pourquoi j'oublie ces concepts). 

Venons-en au problème, c'est que je ne suis pas sûr si une classe ou une référence sont les mêmes, même si j'ai déjà une idée de ce qui est objet. 

Quelqu'un peut-il différencier de manière compréhensible et complète ce que sont les classes, les références et les objets? 

Tout ce que je sais, c'est que la classe ressemble davantage à un modèle pour un objet (modèle pour une maison où la classe est le modèle et la maison est un objet).

46
user962206

Si vous aimez les métaphores du logement:

  • une classe est comme le plan directeur d'une maison. En utilisant ce plan, vous pouvez construire autant de maisons que vous le souhaitez.
  • chaque maison que vous construisez (ou instanciez, dans OO jargon) est un objet, également appelé instance.
  • chaque maison a aussi une adresse, bien sûr. Si vous voulez dire à quelqu'un où se trouve la maison, vous lui remettez une carte avec l'adresse écrite dessus. Cette carte est la référence de l'objet.
  • Si vous voulez visiter la maison, regardez l'adresse indiquée sur la carte. Cela s'appelle déréférencement.

Vous pouvez copier cette référence autant de fois que vous le souhaitez, mais il n'y a qu'une seule maison - vous ne faites que copier la carte portant l'adresse, mais pas la maison elle-même.

En Java, vous ne pouvez pas accéder directement aux objets, vous ne pouvez utiliser que des références. Java ne copie ni n'assigne d'objets entre eux. Mais vous pouvez copier et affecter des références à des variables afin qu'elles se réfèrent au même objet. Les méthodes Java sont toujours pass-by-value, mais la valeur peut être la référence d'un objet. 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 événements se produisent dans la ligne 1. new Foo() indique à la machine virtuelle Java de construire une nouvelle maison à l'aide du modèle Foo. La machine virtuelle le fait et renvoie une référence à la maison. Vous copiez ensuite cette référence dans myFoo. C’est comme demander à un entrepreneur de vous construire une maison. Il le fait, puis vous dit l'adresse de la maison; vous écrivez cette adresse.
  2. À la ligne 2, vous attribuez cette adresse à une autre méthode, callBar. Passons à cette méthode ensuite.
  3. Ici, nous avons une référence Foo foo. Java étant une valeur de passage, la variable foo dans callBar est un copy de la référence myFoo. Pensez-y comme si vous donniez à callBar sa propre carte avec l'adresse de la maison. Que fait callBar avec cette carte? Il demande la construction d'une nouvelle maison, puis utilise la carte que vous lui avez donnée pour écrire l'adresse de cette nouvelle maison. Notez que callBar ne peut maintenant plus se rendre à la première maison (celle que nous avons construite dans la ligne 1), mais cette maison n’a pas changé car une carte qui portait son adresse portait maintenant l’adresse d’une autre maison. .
  4. De retour dans la première méthode, nous déréférencons myFoo pour appeler une méthode dessus (doSomething()). C'est comme regarder la carte, aller à la maison dont l'adresse est indiquée sur la carte, puis faire quelque chose dans cette maison. Notez que notre carte avec l'adresse myFoo n'est pas modifiée par la méthode callBar - rappelez-vous, nous avons donné à callBar un copy de notre référence.

La séquence entière serait quelque chose comme:

  1. Demandez à JVM de construire une maison. C'est le cas et nous donne l'adresse. Nous copions cette adresse sur une carte nommée myFoo.
  2. Nous invoquons callBar. Avant de le faire, nous copions l'adresse écrite sur myfoo dans 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 donnée.
  4. De retour à la première méthode, nous examinons notre carte originale, inchangée; allez à la maison dont l'adresse est sur notre carte; et faire quelque chose là-bas.
119
yshavit

Lorsque vous codez, vous construisez un 

Instance (occurrence, copie)

d'un 

Objet 

d'un dit 

Classe

et garder un

référence

vous pouvez appeler ses méthodes.

En outre, certains OOP basics: Classes , Object , Instance et Référence .

12
Marcelo

Dans le livre "Penser en Java" de Bruce Eckel, il est décrit parfaitement:

"Vous pouvez imaginer une télévision (l'objet) et une télécommande (la référence). Tant que vous tenez cette référence, vous avez une connexion à la télévision, mais quand quelqu'un dit," Change the channel "ou" Lower le volume ", ce que vous manipulez est la référence, qui modifie à son tour l'objet. Si vous voulez vous déplacer dans la pièce tout en contrôlant 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 ce n'est pas parce que vous avez une référence qu'il y a nécessairement un objet qui y est connecté. Donc, si vous voulez contenir un mot ou une phrase, vous créez une référence de chaîne:

String s;

Mais ici, vous avez créé uniquement la référence, pas un objet. Si vous décidez d’envoyer un message à s à ce stade, vous obtiendrez une erreur, car s n’est pas attaché à rien (il n’ya pas de télévision). Une pratique plus sûre consiste donc toujours à initialiser une référence lorsque vous la créez:

String s = "asdf";

Cependant, cela utilise une fonctionnalité Java spéciale: les chaînes peuvent être initialisées avec du texte cité. Normalement, vous devez utiliser un type d'initialisation plus général pour les objets.

Lorsque vous créez une référence, vous souhaitez la connecter à un nouvel objet. Vous le faites généralement avec le nouvel opérateur. Le mot-clé new dit: «Faites-moi un nouvel objet.» Ainsi, dans l'exemple précédent, vous pouvez dire:

String s = new String("asdf");

Non seulement cela signifie-t-il «Crée-moi une nouvelle chaîne», mais cela explique également comment créer cette chaîne en fournissant une chaîne de caractères initiale . Bien entendu, Java est livré avec une pléthore de types prêts à l'emploi, Chaîne. Le plus important est que vous puissiez créer vos propres types. En fait, la création de nouveaux types est l’activité fondamentale de la programmation Java. "

6
Farbod

Supposons que vous écriviez deux lignes de code:

Engine app1 = new Engine(); //LINE 1

Engine app2  = app1; //LINE 2

En ligne 1, Engine est une classe classe , il s’agit essentiellement d’un blue-print.

new Engine () est l'instance instance qui est créée sur le tas.

Vous faites référence à cette instance instance en utilisant app1 et app2 dans votre code.

Donc app1 et app2 sont les références .

3
Sunny Gupta

Lorsque vous créez un objet, ce qui se passe derrière la scène est qu'un morceau de mémoire est réservé pour contenir cet objet. Cela pourrait être n'importe où dans le grand paysage de la mémoire; Cela dépend du système d'exploitation et du compilateur, et vous n'avez aucun contrôle ni aucune connaissance de l'endroit où cela aboutit.

Demandez-vous alors comment utilisez-vous cet objet si vous ne savez pas où il se trouve dans la mémoire? Comment pouvez-vous 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 rester en contact avec l'objet. C'est une petite ficelle attachée au ballon qui est une référence.

Vous utilisez la référence pour dire "je veux toucher ceci objet maintenant!" Ou "je veux lire une valeur dans ceci objet!".

2
Supr

La classe est un modèle, vous avez raison. C'est un peu de connaissance sur la structure de données. Object est cette instance de structure en mémoire. Référence est une adresse mémoire de cette instance.

Si par Object vous entendez l'identificateur Java, alors Object est la classe de base pour toutes les classes Java complexes.

1
Dims

Object est la représentation d'exécution de la Classdefinition. Et le nom avec lequel vous utilisez l'objet est appelé reference (car il fait référence à l'emplacement réel de l'objet en mémoire)

exemple

MyClass ref = new MyClass();

Ici, MyClass est (contient) la définition de class.

new MyClass () crée un object pour cette classe (effectué uniquement pendant l'exécution, d'où le temps d'exécution représenté)

ref est le nom que vous utilisez pour travailler sur l'objet de classe. Il s'agit de reference.

0
Nrj

Class: Utilisé pour définir une entité de la vie réelle dans un environnement de programmation.

Toute entité de la vie réelle ayant au moins une property et une behaviour correspondante peut être considérée comme une classe. Prenons un exemple d'une voiture , c'est d'avoir une propriété accelerator qui aide la voiture à se déplacer et à contrôler sa vitesse. Le comportement correspondant est acceleration, qui est directement proportionnel à la poussée appliquée à l'accélérateur.

class Car {
    private String tier;
    private String 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. Le comportement (method in the class) dépend toujours de la propriété (s) (global attribute(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 String tierMaterial;
    private String 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;
}

Object: utilisé pour définir différentes variantes d'une entité et pour effectuer des manipulations de données séparément.

Maintenant, nous avons défini une entité dans notre programme, disons que nous avons une salle d'exposition de voitures d'occasion, avec des voitures de différentes sociétés. Ainsi, chaque voiture devient une object de notre entité. Les objets peuvent être Audi, Nissan, Ferrari, etc. Ainsi, après l'ouverture de la salle d'exposition, nous ajoutons des voitures comme ceci

static List<Car> showroomCars = new ArrayList<Car>();
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 à la salle d'exposition, une de Nissan et une autre d'Audi, chacune ayant sa propre valeur d'attribut. 

Class ne donne que la définition, la manipulation est effectuée sur Object, pour pouvoir manipuler n'importe quelle classe, l'objet doit être créé. Chaque fois qu'un objet 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ée pour adresser un objet

Lorsque nous disons Car carAudi = new Car();, nous définissons un nouvel objet sur Car et un emplacement de mémoire est attribué à cet objet. La variable de référence carAudi contient l'adresse mémoire de cet objet. L'objet n'est jamais accédé directement par l'utilisateur, ni par 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 objet, faites avec l'aide de la référence pas directement.

Un objet peut avoir un nombre quelconque de références, mais une référence ne peut pointer que sur un objet à 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).
        **/
    }
}
0
Arun Sudhakaran

========= Classe et objet ============

Classe => ex: Person (Plus comme imagination)

Objet => ex: John, Mike (personne réelle)

=========== Référence =============

ex:

Télévision tv1; - (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 un nouveau téléviseur)

0
Tsasaa