2015-04-24 9 views
6

Ich war What is a NullPointerException, and how do I fix it?, und in der akzeptierten Antwort zu lesen, las ich etwas, das ich nicht ganz verstehen:Wie funktionieren Zeiger mit primitiven Typen in Java?

int x; 
x = 10; 

In diesem Beispiel wird die Variable x ist ein int und Java wird es auf 0 für initialisieren Sie. Wenn Sie es in der zweiten Zeile auf 10 setzen, wird Ihr Wert 10 in den Speicherplatz geschrieben, auf den x zeigt.

Ich dachte für primitive Typen, die Variable war die Speicheradresse des tatsächlichen Wertes; Bei komplexen Typen war die Variable lediglich die Speicheradresse eines Zeigers auf den tatsächlichen Wert. Aber die zitierte Antwort sagt mir, dass ich falsch liege. Es heißt "der Speicherplatz, auf den x zeigt."

Wenn also x auf eine Speicheradresse zeigt, die den tatsächlichen Wert speichert, wie unterscheidet sich ein primitiver Typ von einem komplexen Typ? Ich wusste nicht, dass primitive Typen sogar Zeiger hatten. Wie arbeiten Zeiger mit primitiven Typen?

+0

ist es nicht ** eine Referenz ** in den Speicherort? –

+0

@KickButtowski Für komplexe Typen, ja. Was ich nicht verstehe ist, dass etwas auf x zeigt, was ein primitiver Typ ist. – Evorlor

+0

Wenn Sie sagen, zeigen Sie mir Zeiger in C und C++, die wir in Java nicht haben. –

Antwort

9

Ein primitiver Typ und ein komplexer Typ unterscheiden sich hauptsächlich in der Art, wie Daten gespeichert werden. Sie suchen tatsächlich auf die Unterschiede zwischen einem primitiven Typ und einem Klassentyp

1. Jede Variable als Standort in dem Computerspeicher gespeichert ist.

Die obige Anweisung gilt sowohl für primitive Typen als auch für Klasse Typen.

Die Unterschiede:

2. Für eine Urtyp: Der Wert der Variablen wird in dem Speicherplatz zu der Variablen zugeordnet gespeichert.

Das heißt, wenn wir int x = 10 zugewiesen, wird der Wert von x in gespeichert, in dem der Wert von 10 gespeichert ist, das heißt die Speicherstelle. Das heißt wenn wir "x" ansehen, wird '10' dort gespeichert. Vielleicht wäre es an denken an sie eher wie eine „Zuordnung“ helfen, wo Sie gebieten, daß x gleich 10.

3. Für einen Klassentyp sein: Es speichert nur die Speicheradresse das Objekt Das speichert den Wert. Es hält das Objekt nicht direkt.

Integer x = 10 wird eine Speicheradresse, die int Objekt der Typ weist auf, der dann den Wert von 10 halten wird dies als Referenz bekannt ist. Stellen Sie es sich als ein Verzeichnis vor, das Sie anweist, zu welchem ​​Regal zu gehen, um den Wert tatsächlich abzurufen.

Auch

Klassentypen werden auch als Referenztypen oder Objekttypen bekannt, das heißt, sie alle ein Objekt einer Klasse bedeuten (sei es eine Integer-Klasse oder MyPerson Klasse).

Primitive Typen sind keine Referenztypen, da sie keine Referenzen (Speicheradressen) enthalten.

Diese Unterscheidung ist der Grund für die „Wrapper-Klassen“ in der täglichen Gebrauch, und Typen wie Integer werden als Wrapper-Klasse zu einem int, gesehen für die Datenmanipulation zu ermöglichen, wie ganze Zahlen in einer Datenstruktur wie eine Arraylist speichern . Weil ints ein primitiver Datentyp ist, ist kein object, während Integer ist. Da primitive Typen keine Objekte sind, müssen wir sie in eine Klasse einfügen, damit wir sie zu Listen, Wörterbüchern usw. hinzufügen können. Auf diese Weise haben wir eine Liste von Objekten (die auf die primitiven Typen verweisen) kein nackter primitiver Datentyp allein. Siehe this SO question for further info

Weitere Informationen über den Unterschied zwischen einem primitiven und nicht-primitiven (auch bekannt als Klasse/Referenz/Objekttyp) ist detailliert here. Sie haben ein schönes Diagramm, das es auch veranschaulicht.

+0

Ich habe Ihr Format ein wenig geändert, damit es leicht zu lesen ist. hoffe, es ist in Ordnung mit dir. Ich habe schon plus 1 u zu –

+0

So ist es nur, dass ich mit dem Wortlaut von "der Speicherstelle, auf die durch x verwiesen wird" verwechselt wurde? Sie wollten nicht implizieren, dass der Speicherort von x irgendwo hinwies ... sie bedeuteten nur x? – Evorlor

+0

@KickButtowski hat das gerade gesehen. Definitiv okay für mich. Danke! Ich habe einige Informationen hinzugefügt, damit ich deine Änderungen gespiegelt habe. Bitte editieren Sie entsprechend! – matrixanomaly

Verwandte Themen