Différence entre la classe et le type

105

Étant nouveau sur Java, je suis confus entre les concepts de classe et de type . Par exemple, l'objet doit-il "Hello World!"appartenir au type String ou à la classe String ? Ou peut-être les deux?

user2236096
la source
24
Dernièrement, il semble y avoir une tendance à décliner toute question de style «débutant», qu'elle soit bonne ou non. C'est ennuyeux, c'est le moins qu'on puisse dire.
nico_c
9
Aussi pour voter contre toute question que l'électeur ne comprend pas ...
Marquis de Lorne
4
Je conviens que c'est un peu impoli de voter contre les questions de débutant, mais que ce soit bon ou mauvais, toutes les questions pour débutants ont leurs réponses simplement en recherchant sur le Web. Le problème et la raison pour laquelle les gens votent à la baisse est que cela conduit à un débordement de pile :)
Marko Lazić
13
C'est une excellente question - et les 3 votes à clore expliquent pourquoi nous devons pouvoir voter pour rester ouverts . Je me souviens encore quand j'apprenais Java que le jargon OO était le plus gros obstacle.
Lawrence Dol
4
@nickecarlo Il y avait un point dans la FAQ, qui semble avoir été supprimé au cours de la dernière année environ - "la question montre un grave manque de recherche et ne montre aucun signe d'effort fait pour le résoudre avant de poser la question ". Je trouve ennuyeux qu'il y ait une TONNE de questions de conneries que Google pourrait résoudre au lieu que les gens ici perdent leur temps à expliquer «programmation 101» aux autres.
TC1

Réponses:

123

Une classe est un type. Une interface est un type. Une primitive est un type. Un tableau est un type.

Par conséquent, chaque type est également une classe (y compris une constante d'énumération), une interface, une primitive ou un tableau.

Il existe deux catégories distinctes de types: les types primitifs et les types de référence:

  • Une variable de type primitif contient toujours une valeur primitive de ce même type. Une telle valeur ne peut être modifiée que par des opérations d'affectation sur cette variable.
  • Une variable de type référence contient toujours la valeur d'une référence à un objet. Tous les objets, y compris les tableaux, prennent en charge les méthodes de classe Object. Les types de référence sont les types de classe (y compris les types enum), les types d'interface et les types de tableau.

Chaque donnée a un type qui définit sa structure, à savoir combien de mémoire elle prend, comment elle est disposée et, plus important encore, comment vous pouvez interagir avec elle.

Exemples de types primitifs:

  1. int
  2. float
  3. char
  4. boolean

Exemples de types de classes:

  1. String
  2. Integer
  3. Boolean
  4. ArrayList
  5. StringBuilder

Exemples de types d'interface:

  1. Collection
  2. List
  3. Map
  4. Serializable

Exemples de types de tableaux:

  1. int[]
  2. String[]
  3. Integer[][][]

Fondamentalement, tout ce que vous pouvez appeler une variable a un type et les classes sont une sorte de type.

Plus d'informations ici: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html

Brandon
la source
6
N'oubliez pas les tableaux.
Paul Bellora
1
Je ne ferai pas l'édition moi-même parce que je ne suis pas sûr que ce soit ce que vous vouliez écrire, mais cela pourrait mieux fonctionner en disant que les classes sont "une sorte de type" plutôt que "un type de type".
un CVn
@ MichaelKjörling Oui, c'est une meilleure façon de le dire. Je vais le mettre à jour.
Brandon
3
Vous avez oublié le type nul (voir JLS 4.1).
user1803551
1
@AndyDong Une classe abstraite est toujours une classe.
Brandon
6

TLDR - La classe est l'un des types en Java.

Remarque - Pour bien comprendre la réponse, vous devez avoir une petite idée des génériques en Java.


Pour comprendre la différence, comprenons d'abord ce qu'est un type en Java.

Selon JLS SE 10 ,

Il existe deux types de types dans le langage de programmation Java: les types primitifs ( §4.2 ) et les types référence (§4.3).

Qu'est-ce que le type primitif?

a) Les types intégraux sont byte, short, int et long , dont les valeurs sont respectivement des entiers à complément à deux signés 8 bits, 16 bits, 32 bits et 64 bits, et char, dont les valeurs sont 16 bits entiers non signés représentant les unités de code UTF-16 (§3.1).

b) Les types à virgule flottante sont float , dont les valeurs incluent les nombres à virgule flottante IEEE 754 32 bits, et double , dont les valeurs incluent les nombres à virgule flottante IEEE 754 64 bits.

c) Le type booléen a exactement deux valeurs: true et false.

Maintenant, arrivons à ce qu'est le type de référence?

Il existe quatre types de types de référence: les types de classe ( §8.1 ), les types d'interface ( §9.1 ), les variables de type ( §4.4 ) et les types de tableaux ( §10.1 ).

Discutons un par un.

Si vous voyez comment dans JLS, la classe est définie comme ceci:

Une déclaration de classe spécifie un nouveau type de référence nommé.

Il existe deux types de déclarations de classe: les déclarations de classe normales et les déclarations d'énumération .

ClassDeclaration:
NormalClassDeclaration 
EnumDeclaration
NormalClassDeclaration:
{ClassModifier} class TypeIdentifier [TypeParameters] [Superclass] [Superinterfaces] ClassBody

Vous voyez cela [TypeParameters], cela montre que le type de classe inclut également ces classes génériques.

class Example<T>{

}

Le type de classe sera appelé Example

En bref, un type de classe couvre nos énumérations, nos classes régulières (non génériques) comme Stringetc et nos classes génériques aussi.

De même, j'espère que les types d'interface et de tableau sont également clairs. Par type de tableau, nous entendons comme int[], String[]etc.

Venons-en à la dernière partie - Variables de type. Que sont-ils ?

Une variable de type est un identificateur non qualifié utilisé comme type dans les corps de classe, d'interface, de méthode et de constructeur.

Laissez-nous comprendre par l'exemple dans le JLS ci-dessous.

class Test {
    <T extends C & I> void test(T t) {  
        t.mI();           // OK
        t.mCPublic();     // OK 
        t.mCProtected();  // OK 
        t.mCPackage();    // OK

    } 
}

Vous voyez que votre objet dans le paramètre de méthode est de type T. Oui, il Ts'agit d'une variable de type et est / peut être utilisée comme référence. Oui, ça l'est. (Impossible de comprendre cet exemple étrange - Découvrez ce qu'est une méthode générique en Java)

Ceci complète la réponse.

Numéro945
la source
4

«Type» est la catégorie la plus inclusive. Les variables en Java peuvent avoir trois types de types: les 8 types "primitifs" comme int et float, les interfaces et les classes. Les valeurs (par opposition aux variables) peuvent être des instances primitives ou de classe.

Lee Daniel Crocker
la source
2

"Type" définit "de quel type de données il s'agit"

Ex: "hello world" est une chaîne -> "hello world" est de type String (la chaîne n'est pas une donnée prémétive contrairement à int .. donc nous pouvons dire "hello world" est un type de classe string)

10 est un entier -> 10 est un type de données entier.

Satya
la source
5
Soyez prudent lorsque vous utilisez un entier pour expliquer un int puisque Integer! = Int en Java.
nico_c