2017-08-02 6 views
2

Ich lese ein Buch über Java, und sie scheinen die beiden Begriffe "primitive Klasse" und "primitiver Datentyp" synonym zu verwenden.Was ist der Unterschied zwischen einer primitiven Klasse und einem primitiven Datentyp?

Was ist der Unterschied zwischen den beiden? Ich verstehe, dass Integer eine Wrapper-Klasse ist und die Leute als primitiver Datentyp auf int verweisen. Ist es auch eine primitive Klasse?

+3

Eine 'primitive Klasse' ist eine' Wrapperklasse' für einen 'primitiven Typ'. Also für 'int' hast du' Integer', für 'double' hast du' Double' und so weiter – Lino

+0

Klingt ein bisschen oxymoronisch zu mir ... – assylias

+3

Ich glaube nicht, dass ich "primitive class" schon gehört habe, und Wenn ich es täte, wäre mein erster Gedanke "huh?" Soweit ich weiß, bezeichnen die JLS und die offiziellen Java-Tutorials nichts als primitive Klasse. Wie @Lino schrieb, bedeutet Ihr Buch _probably_, was die meisten Leute (und die JLS) als Wrapper-Klasse bezeichnen. – yshavit

Antwort

3

Sie sind verwirrend ihre Umgangssprache hier.

Ein Primitiv ist ein Datentyp, der nicht ein Objekt ist. int, float, double, long, short, boolean und char sind Beispiele für primitive Datentypen. Sie können Methoden für diese Datentypen nicht aufrufen, und sie haben keinen hohen Speicherbedarf, was auffällig ist.

Alles andere ist eine Klasse (oder Klasse-wie im Falle von Schnittstellen und enums). So ziemlich alles, was mit einem Großbuchstaben beginnt, wie String, Integer sind Klassen. Arrays werden auch als Nicht-Primitive klassifiziert, obwohl sie sie halten können. int[] ist kein primitiver Typ, aber er enthält Primitive.

Das einzige, was nahe realistisch kommen könnte die Wrapper-Klassen wäre, as explained by the JLS, aber selbst dann sind sie noch Klassen und nicht Primitiven.

+1

Ich denke, es wäre korrekter zu sagen, alles andere ist ein "Type" (was Klassen, Array-Typen, Datentypen usw. einschließt) – Kapep

+0

@Kapep: Wenn ich mich richtig erinnere, kann man reflektiv durch einen 'Type' auf Primitive zugreifen oder Typ-ähnliche Klasse, also würde ich zögern, diese Terminologie zu überladen. Es ist einfacher, diese als Klassen zu betrachten, um sie in der Zukunft nicht zu verwechseln. – Makoto

+0

Ich muss mich selbst korrigieren, die JLS sagt, es gibt zwei grundlegende Arten von Typen: PrimitiveType und ReferenceType. Damit wäre alles andere ReferenceType. Aber wie auch immer, ich stimme dir zu, dass es wahrscheinlich hilfreicher und weniger verwirrend ist, es hier einfach Klasse oder Klasse zu nennen. – Kapep

4

Die primitive Klasse hat im Zusammenhang mit Reflektions-APIs eine besondere Bedeutung: Wenn Sie eine Methode abrufen müssen, die einen primitiven Typ verwendet, benötigen Sie ein primitives Klassenobjekt, das diesem primitiven Typ entspricht.

Dies ist wichtig, wenn Sie zwischen Überlastungen, die Primitiven und Überlastungen nehmen, die als Wrapper nehmen zu unterscheiden:

void someMethod(int n); 
void someMethod(Integer n); 

Es gibt zwei Möglichkeiten zu erhalten, um dieses Klassenobjekt:

  • Mit Klasse wörtlichen, z.B. int.class oder
  • unter Verwendung von Mitglied der entsprechenden Hülle Klasse, z.B. Integer.TYPE.

Dies ist nicht dieselbe Klasse wie die Klasse, die den primitiven Wrapper darstellt. Mit anderen Worten:

int.class != Integer.class 
+0

Genau darum ging es mir. Ich wusste, dass man 'int.class' oder eine gleichwertige primitive Klassendeklaration verwenden könnte, um in Reflektion zu kommen. – Makoto

Verwandte Themen