Differenza tra classe e tipo


105

Essendo nuovo in Java, sono confuso tra i concetti di classe e tipo . Ad esempio, l'oggetto dovrebbe "Hello World!"appartenere al tipo String o alla classe String ? O forse entrambi?


24
Ultimamente sembra esserci un'inclinazione a sottovalutare le domande in stile "principiante", che siano buone o meno. È fastidioso, per non dire altro.
nico_c

9
Anche per downvote qualsiasi domanda che l'elettore non capisca ...
Marchese di Lorne

4
Sono d'accordo che sia un po 'scortese dare un voto negativo mentre dici domande per principianti, ma se è buono o cattivo, tutte le domande per principianti hanno le loro risposte semplicemente cercando sul web. Il problema e il motivo per cui le persone votano negativamente è perché questo sta portando a un overflow dello stack :)
Marko Lazić

13
Questa è una grande domanda e i 3 voti per chiudere sono il motivo per cui dobbiamo essere in grado di votare per restare aperti . Ricordo ancora quando stavo imparando Java che il gergo OO era il più grande impedimento.
Lawrence Dol

4
@nickecarlo C'era un punto nelle FAQ, che sembra essere stato tolto durante l'ultimo anno circa - "la domanda mostra una grave mancanza di ricerca e non mostra segni di sforzo compiuto per risolverla prima di porre la domanda ". Trovo fastidioso che ci siano un sacco di domande di merda che Google potrebbe risolvere invece di persone qui che effettivamente sprecano il loro tempo a spiegare "programmazione 101" ad altri.
TC1

Risposte:


123

Una classe è un tipo. Un'interfaccia è un tipo. Una primitiva è un tipo. Un array è un tipo.

Pertanto, ogni tipo è anche una classe (inclusa una costante enum), un'interfaccia, una primitiva o un array.

Esistono due categorie distinte di tipi: tipi primitivi e tipi di riferimento:

  • Una variabile di tipo primitivo contiene sempre un valore primitivo dello stesso tipo. Tale valore può essere modificato solo mediante operazioni di assegnazione su quella variabile.
  • Una variabile di tipo riferimento contiene sempre il valore di un riferimento a un oggetto. Tutti gli oggetti, inclusi gli array, supportano i metodi di classe Object. I tipi di riferimento sono tipi di classe (inclusi i tipi enum), tipi di interfaccia e tipi di matrice.

Ogni dato ha un tipo che ne definisce la struttura, ovvero quanta memoria occupa, come è disposto e, cosa più importante, come puoi interagire con esso.

Esempi di tipi primitivi:

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

Esempi di tipi di classe:

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

Esempi di tipi di interfaccia:

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

Esempi di tipi di array:

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

Fondamentalmente, tutto ciò a cui puoi fare riferimento come variabile ha un tipo e le classi sono una sorta di tipo.

Maggiori informazioni qui: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html


6
Non dimenticare gli array.
Paul Bellora

1
Non effettuerò la modifica da solo perché non sono sicuro che sia quello che intendevi scrivere, ma potrebbe funzionare meglio dire che le classi sono "un tipo di tipo" piuttosto che "un tipo di tipo".
un CVn

@ MichaelKjörling Sì, è un modo migliore per dirlo. Lo aggiornerò.
Brandon

3
Hai dimenticato il tipo null (vedi JLS 4.1).
user1803551

1
@AndyDong Una classe astratta è ancora una classe.
Brandon

6

TLDR : la classe è uno dei tipi in Java.

Nota: per comprendere appieno la risposta, è necessario avere una piccola idea dei generici in Java.


Per capire la differenza dobbiamo prima capire cos'è un Type in Java.

Secondo JLS SE 10 ,

Esistono due tipi di tipi nel linguaggio di programmazione Java: tipi primitivi ( §4.2 ) e tipi di riferimento (§4.3).

Cos'è il tipo primitivo?

a) I tipi integrali sono byte, short, int e long , i cui valori sono rispettivamente interi a complemento a due con segno a 8 bit, 16 bit, 32 bit e 64 bit, e char, cui valori sono 16 bit interi senza segno che rappresentano unità di codice UTF-16 (§3.1).

b) I tipi a virgola mobile sono float , i cui valori includono i numeri a virgola mobile IEEE 754 a 32 bit e double , i cui valori includono i numeri a virgola mobile IEEE 754 a 64 bit.

c) Il tipo booleano ha esattamente due valori: vero e falso.

Ora, veniamo a cos'è il tipo di riferimento?

Esistono quattro tipi di tipi di riferimento: tipi di classe ( §8.1 ), tipi di interfaccia ( §9.1 ), variabili di tipo ( §4.4 ) e tipi di array ( §10.1 ).

Parliamo uno per uno.

Se vedi come in JLS, Class è definita in questo modo:

Una dichiarazione di classe specifica un nuovo tipo di riferimento denominato.

Esistono due tipi di dichiarazioni di classe: normali dichiarazioni di classe e dichiarazioni enum .

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

Come vedi [TypeParameters], questo mostra che il tipo di classe include anche quelle classi generiche.

class Example<T>{

}

Verrà chiamato il tipo di classe Example

In breve, un tipo di classe copre le nostre enumerazioni, le nostre classi regolari (non generiche) come String ecc e anche le nostre classi generiche.

Allo stesso modo, spero che anche i tipi di interfaccia e array siano chiari. Per tipo di array si intende come int[], String[]ecc.

Veniamo all'ultima parte: le variabili di tipo. Quali sono ?

Una variabile di tipo è un identificatore non qualificato utilizzato come tipo nei corpi di classe, interfaccia, metodo e costruttore.

Cerchiamo di capire dall'esempio nel JLS sotto di esso.

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

    } 
}

Vedi che il tuo oggetto nel parametro del metodo è di tipo T. Sì, questa Tè la variabile di tipo ed è / può essere utilizzata come riferimento. Sì. (Impossibile capire questo strano esempio - Scopri cos'è il metodo generico in Java)

Questo completa la risposta.


4

"Tipo" è la categoria più inclusiva. Le variabili in Java possono avere tre tipi di tipi: gli 8 tipi "primitivi" come int e float, interfacce e classi. I valori (al contrario delle variabili) possono essere istanze primitive o di classe.


2

"Tipo" definisce "di che tipo di dati si tratta"

Es: "ciao mondo" è una stringa -> "ciao mondo" è di tipo stringa (la stringa non è un dato premetivo a differenza di int .. quindi possiamo dire che "ciao mondo" è un tipo di classe stringa)

10 è un int -> 10 è un tipo di dati intero.


5
Fai attenzione quando usi un intero per spiegare un int poiché Integer! = Int in Java.
nico_c
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.