La différence entre les classes, les objets et les instances


Réponses:


86

Java (et tout autre langage de programmation) est modélisé en termes de types et de valeurs . Au niveau théorique, une valeur est une représentation d'un quantum d'informations et un type est un ensemble de valeurs. Quand nous disons que la valeur X est une instance de type Y, nous disons simplement que X est membre de l'ensemble de valeurs qui est de type Y.

C'est donc ce que signifie vraiment le terme «instance»: il décrit une relation et non une chose.

Le système de types du langage de programmation Java prend en charge deux types de types, les types primitifs et les types de référence . Les types de référence sont ensuite divisés en classes et types de tableaux . Un objet Java est une instance d'un type référence.

Un objet est une instance de classe ou un tableau. ( JLS 4.3.1 )

C'est la vue théorique des types.

En pratique, la plupart des développeurs Java traitent les mots «instance» et «objet» comme des synonymes. (Et cela m'inclut alors j'essaye d'expliquer quelque chose rapidement.) Et la plupart des développeurs utilisent le mot «valeur» plutôt que «instance» pour désigner une instance d'un type primitif.


3
J'apprécie vraiment votre réponse monsieur, et j'ai presque compris, juste une dernière question. Nous disons: "Chaque fois que le compilateur atteint le constructeur d'argument 0, il crée une instance d'une classe.". Dans ce contexte, qu'est-ce qui est vraiment créé une instance ou un objet? Un objet je suppose et nous utilisons le mot "instance" comme synonyme. Mais ce serait gentil, si vous mieux le confirmer.
Pranjut

3
@Ryan: Fondamentalement oui: il crée un objet qui est une instance de la classe en question. (Mais notez que la phrase citée dit "instance d'une classe" plutôt que simplement "instance" ... donc l'auteur n'utilise pas réellement "instance" comme synonyme ici.)
Stephen C

1
@RuneFS - la "modélisation" dont je parle n'est pas une question de représentation. C'est théorique. Oui, dans certains langages, il existe des objets qui désignent des types, ou même qui vous permettent d'énumérer toutes les instances d'un type. Mais ces propriétés augmentent la «modélisation» générique plutôt que de l'invalider.
Stephen C

1
@RuneFS - Non ... je parle de "théorie des types". C'est une branche des mathématiques. Il est indépendant de la technologie utilisée pour exécuter les programmes. La théorie des types la plus proche du calcul est le calcul lambda. (Si vous êtes intéressé, essayez de vous procurer une copie de "Types and Programming Languages" par Benjamin C. Pierce.)
Stephen C

1
Vous faites la même erreur que user2390183. Vous traitez les variables comme des "noms". Ils ne sont pas. Les variables sont des «porte-références» qui contiennent des références à des objets. Les objets n'ont pas de noms intrinsèques. Les références sont ce qu'il y a de plus proche d'un "nom" pour un objet, sauf qu'elles n'ont pas de représentation constante. (Le GC peut déplacer un objet qui change la configuration binaire utilisée pour représenter la référence.)
Stephen C

96

Une classe est un plan que vous utilisez pour créer des objets . Un objet est une instance d'une classe - c'est une «chose» concrète que vous avez créée en utilisant une classe spécifique. Ainsi, «objet» et «instance» sont la même chose, mais le mot «instance» indique la relation d'un objet avec sa classe.

Ceci est facile à comprendre si vous regardez un exemple. Par exemple, supposons que vous ayez une classe House. Votre propre maison est un objet et une instance de classe House. La maison de votre sœur est un autre objet (une autre instance de classe House).

// Class House describes what a house is
class House {
    // ...
}

// You can use class House to create objects (instances of class House)
House myHouse = new House();
House sistersHouse = new House();

La classe Housedécrit le concept de ce qu'est une maison, et il existe des maisons concrètes spécifiques qui sont des objets et des instances de classe House.

Remarque: C'est exactement la même chose en Java que dans tous les langages de programmation orientés objet.


class House { // blue print for House Objects } class Car { // blue print for Instances of Class Car } House myHouse = House new(); Car myCar = Car new();
Suraj Jain

myHouse et myCar sont des objets myHouse est une instance de House (relie Object-myHouse à sa Class-House) myCar est une instance de Car. Est-ce vrai, s'il vous plaît voir la réponse ci-dessus par user2390183 est-ce correct ou non?
Suraj Jain

29

Une classe est essentiellement une définition et contient le code de l'objet. Un objet est une instance d'une classe

par exemple si vous dites

String word = new String();

la classe est la classe String, qui décrit le mot objet (instance).

Lorsqu'une classe est déclarée, aucune mémoire n'est allouée, donc la classe n'est qu'un modèle.

Lorsque l'objet de la classe est déclaré, la mémoire est allouée.


Voulez-vous dire que les objets et les instances sont identiques?
Pranjut

Merci David pour le lien. À partir des sujets que j'ai obtenus, toutes les choses du monde réel qui ont un état et un comportement peuvent être appelées "objet". Et pour classer ces objets, nous utilisons la classe (une classe est le plan à partir duquel les objets individuels sont créés). Et cela dit que les objets de la classe sont des instances. Maintenant, s'il vous plaît, dites-moi quelles sont les différences entre objet et instance? Cela signifie-t-il que l'objet n'existe pas vraiment dans le contexte de la programmation et que l'instance y représente un objet?
Pranjut

@Mustafa: Je suis désolé de vous contredire, mais selon le JLS, un tableau est aussi un objet en Java. Et vous constaterez que le JLS ne définit pas du tout le terme «instance». Voyez ma réponse.
Stephen C

@Ryan: Voir ma réponse pour la distinction entre "instance" et "objet". La réponse et le commentaire de @ Mustafa sont (IMO) trompeurs.
Stephen C

@mustafabar - "Lorsqu'une classe est déclarée, aucune mémoire n'est allouée, donc la classe n'est qu'un modèle." - Et ce n'est pas vrai non plus. La mémoire est allouée pour (au moins) représenter les staticvariables de la classe. (Et pour d'autres choses aussi liées à l'identité de type de la classe.)
Stephen C

13

J'aime l'explication de Jesper en termes profanes

En improvisant des exemples de la réponse de Jesper,

class House {
// blue print for House Objects
}

class Car {
// blue print for Instances of Class Car 
}

House myHouse = new House();
Car myCar = new Car();

myHouse et myCar sont des objets

myHouse est une instance de House (relie Object-myHouse à sa Class-House) myCar est une instance de Car

en bref

"myHouse est une instance de Class House", ce qui revient à dire "myHouse est un objet de type House"


6

La classe est le type de données, vous utilisez ce type pour créer un objet.

  • L'instance est logique mais l'objet est physique signifie qu'elle occupe de la mémoire.

  • Nous pouvons créer une instance pour la classe abstraite ainsi que pour l'interface, mais nous ne pouvons pas créer un
    objet pour celles-ci.

  • L'objet est une instance de classe et l'instance signifie représentative de la classe, c'est-à-dire un objet.

  • Instance fait référence à la référence d'un objet.

  • L'objet pointe en fait vers l'adresse mémoire de cette instance.

  • Vous ne pouvez pas passer d'occurrence sur les calques, mais vous pouvez passer l'objet sur les calques

  • Vous ne pouvez pas stocker une instance mais vous pouvez stocker un objet

  • Un seul objet peut avoir plus d'une instance.

  • L'instance aura à la fois la définition de classe et la définition d'objet alors que, comme dans object, elle n'aura que la définition d'objet.

Syntaxe de l'objet:

 Classname var=new Classname();

Mais pour la création par exemple, il ne renvoie qu'un pointeur faisant référence à un objet, la syntaxe est:

 Classname varname;

3

En java, les objets sont générés sur la mémoire du tas. Celles-ci nécessitent une référence pour être pointée et utilisée dans notre application. La référence a l'emplacement mémoire de l'objet avec lequel nous pouvons utiliser les objets dans notre application. Une référence en bref n'est rien d'autre qu'un nom de la variable qui stocke l'adresse de l'objet instancié sur un emplacement mémoire.

Un instanceest un terme général pour object. FYI, Objectest une classe.

Par exemple,

Class A{

}

A ref = new A();

Pour l'extrait de code ci-dessus, ref est la référence pour un objet de classe A généré sur le tas.


3

Honnêtement, je me sens plus à l'aise avec les définitions du blog Alfred :

Objet : les objets du monde réel partagent 2 caractéristiques principales, état et comportement. Les humains ont un état (nom, âge) et un comportement (courir, dormir). La voiture a un état (vitesse actuelle, vitesse actuelle) et un comportement (freinage, changement de vitesse). Les objets logiciels sont conceptuellement similaires aux objets du monde réel: ils sont eux aussi constitués d'un état et d'un comportement associé. Un objet stocke son état dans des champs et expose son comportement via des méthodes.

Classe : est un «modèle» / «plan directeur» utilisé pour créer des objets. Fondamentalement, une classe comprendra un champ, un champ statique, une méthode, une méthode statique et un constructeur. Le champ est utilisé pour contenir l'état de la classe (ex: nom de l'objet Student). La méthode est utilisée pour représenter le comportement de la classe (par exemple: comment un objet Student va se lever). Le constructeur est utilisé pour créer une nouvelle instance de la classe.

Instance : une instance est une copie unique d'une classe qui représente un objet. Lorsqu'une nouvelle instance d'une classe est créée, la JVM allouera une salle de mémoire pour cette instance de classe.

Compte tenu de l'exemple suivant:

public class Person {
    private int id;
    private String name;
    private int age;

    public Person (int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (id != other.id)
            return false;
        return true;
    }

    public static void main(String[] args) {
        //case 1
        Person p1 = new Person(1, "Carlos", 20);
        Person p2 = new Person(1, "Carlos", 20);

        //case 2
        Person p3 = new Person(2, "John", 15);
        Person p4 = new Person(3, "Mary", 17);
    }
}

Pour le cas 1, il existe deux instances de la classe Person, mais les deux instances représentent le même objet.

Pour le cas 2, il existe deux instances de la classe Person, mais chaque instance représente un objet différent.

Ainsi, la classe, l'objet et l'instance sont des choses différentes. L'objet et l'instance ne sont pas des synonymes comme cela est suggéré dans la réponse sélectionnée comme bonne réponse.


2

Si vous avez un programme qui modélise des voitures, vous avez une classe pour représenter les voitures, donc dans Code, vous pouvez dire:

Car someCar = new Car();

someCar est maintenant une instance de la classe Car. Si le programme est utilisé dans un atelier de réparation et que le someCar représente votre voiture dans son système, alors votre voiture est l'objet.

Donc, Car est une classe qui peut représenter n'importe quelle voiture du monde réel someCar est une instance de la classe Car et someCare représente un objet réel (votre voiture)

Cependant, l'instance et l'objet sont très souvent utilisés de manière interchangeable lorsqu'il s'agit de discuter du codage


1
Il s'agit à proprement parler d' someCarune référence à une instance Car. L'instance elle-même n'a pas de nom.
Joachim Sauer

2

Tout type de données que votre ordinateur stocke et traite est dans sa représentation la plus basique une rangée de bits. La façon dont ces bits sont interprétés se fait à travers les types de données. Les types de données peuvent être primitifs ou complexes. Les types de données primitifs sont, par exemple, int ou double. Ils ont une longueur et une manière spécifiques d'être interprétées. Dans le cas d'un entier, le premier bit est généralement utilisé pour le signe, les autres sont utilisés pour la valeur.

Les types de données complexes peuvent être des combinaisons de types de données primitifs et d'autres types de données complexes et sont appelés «classe» en Java.

Vous pouvez définir le type de données complexe PeopleName composé de deux chaînes appelées prénom et nom. Chaque chaîne en Java est un autre type de données complexe. Les chaînes en retour sont (probablement) implémentées en utilisant le type de données primitif char pour lequel Java sait combien de bits ils prennent pour stocker et comment les interpréter.

Lorsque vous créez une instance d'un type de données, vous obtenez un objet et vos ordinateurs lui réservent de la mémoire et se souviennent de son emplacement et du nom de cette instance. Une instance de PeopleName en mémoire occupera l'espace des deux variables String plus un peu plus pour la comptabilité. Un entier occupe 32 bits en Java.

Les types de données complexes peuvent se voir attribuer des méthodes. Les méthodes peuvent effectuer des actions sur leurs arguments ou sur l'instance du type de données à partir duquel vous appelez cette méthode. Si vous avez deux instances de PeopleName appelées p1 et p2 et que vous appelez une méthode p1.getFirstName (), elle renvoie généralement le prénom de la première personne mais pas celui de la seconde.


2

Le concept derrière les classes et les objets est d'encapsuler la logique dans une seule unité de programmation. Les classes sont les plans à partir desquels les objets sont créés.

Voici un exemple de classe représentant une voiture:

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

Vous pouvez créer des instances de l' objet Car comme ceci:

Car audi = new Car();
Car toyota = new Car();

J'ai pris l'exemple de ce tutoriel


2

Classe : Structure

Objet : Manifestation physique

Exemple : chaque objet créé à partir de la classe

Référence : adresse de l'objet


1

Classe

  • Il a une existence logique, c'est-à-dire qu'aucun espace mémoire n'est alloué lors de sa création.

  • C'est un ensemble d'objets.

  • Une classe peut être considérée comme un modèle pour créer des objets.

    • Il est créé à l'aide du mot-clé de classe

    • Une classe définit les méthodes et les membres de données qui seront possédés par Objects.


Objet

  • Il a une existence physique, c'est-à-dire que l'espace mémoire est alloué lors de sa création.

  • C'est une instance d'une classe.

  • Un objet est une entité unique qui contient des membres de données et des fonctions membres ensemble en langage POO.

    • Il est créé à l'aide d'un nouveau mot-clé

    • Un objet spécifie les implémentations des méthodes et les valeurs qui seront possédées par les données membres de la classe.


1
L'espace peut être alloué lorsqu'une classe est "créée". L'espace est requis pour toutes les variables statiques définies par la classe. (Et "logique" par rapport à "physique" l'étire, car une représentation d'objet n'est que des modèles de bits d'aide dans certains périphériques de mémoire.)
Stephen C

@StephenC quelle pourrait être alors l'autre différence?

Voir ma réponse. On ne peut pas répondre correctement à cette question en parlant simplement des différences.
Stephen C

0

Une classe est un plan qui est nécessaire pour créer un objet (= instance).

La différence entre un objet et une instance est qu'un objet est une chose et une instance est une relation.

En d'autres termes, instance décrit la relation d'un objet avec la classe à partir de laquelle l'objet a été créé.


-1

La définition "L'objet est une instance d'une classe" est conceptuellement erronée, mais correcte selon l'implémentation. En fait, les fonctionnalités orientées objet sont tirées de la vie réelle, pour concentrer l'esprit du programmeur du plus au moins. Dans la vraie vie, les classes sont conçues pour gérer l'objet. Par exemple, nous, les êtres humains, avons une caste, une religion, une nationalité et bien plus encore. Ces castes, religion, nationalité sont les classes et n'existent pas sans les êtres humains. Mais dans l'implémentation, il n'y a pas d'existence d'objets sans classes. Object-Object est une entité discrète ayant un attribut bien défini. Ici, discret signifie quelque chose qui le rend unique par rapport aux autres. Un attribut bien défini a du sens dans certains contextes. Classe - Classification des objets ayant un comportement commun ou des objets d'un type commun.


-1

Bien que les réponses ci-dessus soient correctes, une autre façon de penser aux classes et aux objets serait d'utiliser des exemples du monde réel: une classe nommée Animal peut contenir des objets comme Cat, Dog ou Fish. Un objet avec un titre de Bible serait de classe Livre, etc. Les classes sont générales, les objets sont spécifiques. Cet exemple de réflexion m'a aidé lorsque j'apprenais Java.


Oui ... mais les analogies peuvent aussi prêter à confusion. Si Animalest une classe et Catest une instance, qu'est-ce que mon chat «Fluffy»?
Stephen C

-2

La classe est un modèle ou un type. Un objet est une instance de la classe.

Par exemple:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet est une classe et newTweet est un objet de la classe.


Ce ne sont que des mots. Vous n'expliquez pas vraiment ce que signifient les mots. (Et en fait, les classes Java ne se comportent PAS comme des modèles, que ce soit dans la vraie vie ou de la même manière que le font dans des langages comme Javascript, Python, Ruby, etc.)
Stephen C
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.