Unterschied zwischen Klasse und Typ

105

Da ich neu in Java bin, bin ich verwirrt zwischen den Konzepten Klasse und Typ . Sollte das Objekt beispielsweise "Hello World!"zum Typ String oder zur Klasse gehören String ? Oder vielleicht beides?

user2236096
quelle
24
In letzter Zeit scheint es eine Neigung zu geben, Fragen im "Anfänger" -Stil abzulehnen, ob sie gut sind oder nicht. Es ist nervig, um es gelinde auszudrücken.
nico_c
9
Auch um jede Frage abzulehnen, die der Wähler nicht versteht ...
Marquis von Lorne
4
Ich bin damit einverstanden, dass es etwas unhöflich ist, wenn Sie Anfängerfragen stellen, aber ob gut oder schlecht, alle Anfängerfragen haben ihre Antworten nur durch Durchsuchen des Webs. Das Problem und der Grund, warum die Leute abstimmen, ist, dass dies zu einem Stapelüberlauf führt :)
Marko Lazić
13
Dies ist eine großartige Frage - und die 3 Stimmen zum Schließen sind der Grund, warum wir abstimmen müssen, um offen zu bleiben . Ich erinnere mich noch, als ich Java lernte, dass der OO-Jargon das größte Hindernis war.
Lawrence Dol
4
@nickecarlo Früher gab es einen Punkt in den FAQ, der im letzten Jahr oder so herausgenommen wurde - "Die Frage zeigt einen ernsthaften Mangel an Forschung und zeigt keine Anzeichen von Anstrengungen, die unternommen wurden, um sie zu lösen, bevor die Frage gestellt wurde ". Ich finde es ärgerlich, dass es eine TONNE Bullshit-Fragen gibt, die Google lösen könnte, anstatt dass die Leute hier tatsächlich ihre Zeit damit verschwenden, anderen "Programmieren 101" zu erklären.
TC1

Antworten:

123

Eine Klasse ist ein Typ. Eine Schnittstelle ist ein Typ. Ein Primitiv ist ein Typ. Ein Array ist ein Typ.

Daher ist jeder Typ auch entweder eine Klasse (einschließlich einer Enum-Konstante), eine Schnittstelle, ein Grundelement oder ein Array.

Es gibt zwei verschiedene Kategorien von Typen: primitive Typen und Referenztypen:

  • Eine Variable vom primitiven Typ enthält immer einen primitiven Wert desselben Typs. Ein solcher Wert kann nur durch Zuweisungsoperationen für diese Variable geändert werden.
  • Eine Variable vom Referenztyp enthält immer den Wert einer Referenz auf ein Objekt. Alle Objekte, einschließlich Arrays, unterstützen die Klassenmethoden Object. Die Referenztypen sind Klassentypen (einschließlich Aufzählungstypen), Schnittstellentypen und Arraytypen.

Jedes Datenelement hat einen Typ, der seine Struktur definiert, nämlich wie viel Speicher es beansprucht, wie es angeordnet ist und was noch wichtiger ist, wie Sie damit interagieren können.

Beispiele für primitive Typen:

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

Beispiele für Klassentypen:

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

Beispiele für Schnittstellentypen:

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

Beispiele für Array-Typen:

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

Grundsätzlich hat alles, was Sie als Variable bezeichnen können, einen Typ, und Klassen sind eine Art Typ.

Weitere Informationen finden Sie hier: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html

Brandon
quelle
6
Arrays nicht vergessen.
Paul Bellora
1
Ich werde die Bearbeitung nicht selbst vornehmen, da ich nicht sicher bin, ob Sie das schreiben wollten, aber es könnte besser funktionieren , wenn Sie sagen, dass Klassen "eine Art Typ" sind und nicht "eine Art Typ".
Ein Lebenslauf
@ MichaelKjörling Ja, das ist eine bessere Art, es zu sagen. Ich werde es aktualisieren.
Brandon
3
Sie haben den Nulltyp vergessen (siehe JLS 4.1).
user1803551
1
@AndyDong Eine abstrakte Klasse ist immer noch eine Klasse.
Brandon
6

TLDR - Klasse ist einer der Typen in Java.

Hinweis - Um die Antwort vollständig zu verstehen, müssen Sie eine kleine Vorstellung von Generika in Java haben.


Um den Unterschied zu verstehen, lassen Sie uns zunächst verstehen, was ein Typ in Java ist.

Laut JLS SE 10 ,

In der Programmiersprache Java gibt es zwei Arten von Typen : primitive Typen ( §4.2 ) und Referenztypen (§4.3).

Was ist primitiver Typ?

a) Die Integraltypen sind Byte, Short, Int und Long , deren Werte 8-Bit-, 16-Bit-, 32-Bit- und 64-Bit-Ganzzahlen mit vorzeichenbehafteten Zweierkomplementen sind, und char, deren Werte 16-Bit sind Ganzzahlen ohne Vorzeichen, die UTF-16-Codeeinheiten darstellen (§3.1).

b) Der Gleitkommaprozessor Typen float , deren Werte umfassen , die 32-Bit - IEEE - 754 - Gleitkommazahlen und Doppel , deren Werte sind die 64-Bit - IEEE 754 - Gleitkommazahlen.

c) Der boolesche Typ hat genau zwei Werte: true und false.

Kommen wir nun zu dem Referenztyp.

Es gibt vier Arten von Referenztypen: Klassentypen ( §8.1 ), Schnittstellentypen ( §9.1 ), Typvariablen ( §4.4 ) und Array-Typen ( §10.1 ).

Lassen Sie uns eins nach dem anderen diskutieren.

Wenn Sie sehen, wie in JLS die Klasse wie folgt definiert ist:

Eine Klassendeklaration gibt einen neuen benannten Referenztyp an.

Es gibt zwei Arten von Klassendeklarationen: normale Klassendeklarationen und Enum-Deklarationen .

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

Sie sehen, dass [TypeParameters]dies zeigt, dass der Klassentyp auch diese generischen Klassen enthält.

class Example<T>{

}

Der Klassentyp wird aufgerufen Example

Kurz gesagt, ein Klassentyp umfasst unsere Aufzählungen, unsere regulären (nicht generischen) Klassen wie Stringusw. und auch unsere generischen Klassen.

Ebenso hoffe ich, dass auch die Schnittstellen- und Array-Typen klar sind. Mit dem Array - Typ verstehen wir wie int[], String[]usw.

Kommen wir zum letzten Teil - Typvariablen. Was sind Sie ?

Eine Typvariable ist ein nicht qualifizierter Bezeichner, der als Typ in Klassen-, Schnittstellen-, Methoden- und Konstruktorkörpern verwendet wird.

Lassen Sie uns anhand des Beispiels in der JLS darunter verstehen.

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

    } 
}

Sie sehen, dass Ihr Objekt im Methodenparameter vom Typ ist T. Ja, dies Tist eine Typvariable und kann als Referenz verwendet werden. Ja, so ist es. (Konnte dieses seltsame Beispiel nicht verstehen - Erfahren Sie, was eine generische Methode in Java ist.)

Dies vervollständigt die Antwort.

Nummer 945
quelle
4

"Typ" ist die umfassendere Kategorie. Variablen in Java können drei Arten von Typen haben: die 8 "primitiven" Typen wie int und float, Schnittstellen und Klassen. Werte (im Gegensatz zu Variablen) können primitive oder Klasseninstanzen sein.

Lee Daniel Crocker
quelle
2

"Typ" definiert, um welche Art von Daten es sich handelt.

Beispiel: "Hallo Welt" ist ein String -> "Hallo Welt" ist ein String-Typ (String ist im Gegensatz zu int keine prämetiven Daten. Wir können also sagen, dass "Hallo Welt" ein String-Klassentyp ist.)

10 ist ein int -> 10 ist ein ganzzahliger Datentyp.

Satya
quelle
5
Seien Sie vorsichtig mit der Verwendung von Integer, um ein int zu erklären, da Integer! = Int in Java.
nico_c