C ++ unterstützt Zeiger, Java dagegen nicht. Aber als viele Programmierer in Frage stellten, wie man ohne Zeiger arbeiten kann, begannen die Promoter, "eingeschränkte Zeiger" zu sagen. Also können wir sagen, dass Java eingeschränkte Zeiger unterstützt?
Die Terminologie ist hier ziemlich unscharf.
Java unterstützt, was es "Referenzen" nennt. Referenzen agieren viel wie Zeiger in C / C ++ - ähnlichen Sprachen. Sie arbeiten nicht so, wie "Referenzen" in diesen Sprachen funktionieren.
Die wichtigsten Unterschiede zwischen einem Zeiger in C und einer Referenz in Java sind:
Für einige Verwendungen von Zeigern hat dies keinen wirklichen Effekt (zum Beispiel funktionieren verknüpfte Listen in beiden Sprachen ziemlich gleich), für andere ist der Unterschied ziemlich groß (Arrays in C sind nur ausgefallene Zeiger Arithmetik, in Java arbeiten sie ganz anders).
So könnten Java-Referenzen gewissermaßen "eingeschränkte Zeiger" genannt werden.
Wikipedia definiert einen Zeiger als
... ein Datentyp für die Programmiersprache, dessen Wert sich direkt auf bezieht (oder auf einen anderen Wert zeigt)
Schwerpunkt meiner. Gemäß dieser strikten Definition hat Java keine Zeiger.
Die allgemeinere Referenz ist die Oberklasse von Zeigern, widerspricht aber auch abstrakteren Dingen wie Dateigriffen oder auch URLs.
Zuerst müssen Sie "eingeschränkte Zeiger" verstehen. Auszug aus Wikipedia :
Ein Hauptproblem bei Zeigern ist, dass sie so lange wie möglich sein können direkt als eine Zahl manipuliert, können sie dazu gebracht werden, auf unbenutzt zu zeigen Adressen oder Daten, die für andere Zwecke verwendet werden. Viele Sprachen, einschließlich der meisten funktionalen Programmiersprachen und neueren Imperative Sprachen wie Java, ersetzen Zeiger mit einem undurchsichtigeren Art der Referenz, typischerweise bezeichnet als einfach eine Referenz, die kann nur für Objekte verwendet werden und nicht als Zahlen manipuliert werden, Verhindern dieser Art von Fehler. Die Array-Indizierung wird als Spezial behandelt Fall.
Was es bedeutet, dass Sie in Java keinen Zeiger hinzufügen oder davon abziehen können, da die Speicherverwaltung von der JVM selbst ausgeführt wird.
Java hat Referenz übernommen. Referenzen haben Typen, genau wie in C, und sie sind typsicher, da diese Referenz nicht als unformatierte Adresse interpretiert werden kann und eine unsichere Konvertierung nicht erlaubt ist.
Ein weiterer wichtiger Unterschied zwischen Java und C / C ++ besteht darin, dass Referenzen ein Index für ein Objekt sind. Während in C / C ++ ein Zeiger eine Adresse im Speicher ist.
In der 32-Bit-JVM sind sie dasselbe, in der 64-Bit-JVM jedoch nicht. Der Unterschied zu Heap-Größen unter 32 GB liegt darin, dass Referenzen immer noch 32-Bit sind (sogar in einer 64-Bit-JVM). Dies liegt daran, dass Objekte auf einer 8-Byte-Grenze zugewiesen werden bis 32 GB Speicher (4 G * 8 Bytes)
In einem 64-Bit-C / C ++ - Programm muss ein Zeiger in der Lage sein, jedes Byte zu referenzieren, obwohl die Speicherzuweisung auf einer 16-Byte-Grenze liegt und daher 64-Bit groß ist (technisch sollte es möglich sein) es 32-Bit für weniger als 4 GB Speicher.)
Ein intelligenter Zeiger benötigt zwei zugrundeliegende Zeiger (für insgesamt 16 Bytes), aber auf gcc die minimale Zuweisungsgröße für Die Referenzzahl beträgt 32 Byte (und dann haben Sie die Größe des Objekts, auf das Sie zeigen). Die Gesamtgröße beträgt 32 Byte + 16 Byte pro Zeiger. c.f. 4 Bytes pro Referenz in Java. (8 Bytes, wenn Sie 32+ GB Heap haben)
Zusammenfassend muss eine Java-Referenz nicht die tatsächliche Adresse oder sogar die gleiche Größe wie ein Zeiger sein. Es ist sicherlich viel kleiner als ein intelligenter Zeiger.
Wenn Leute sagen, dass Java Zeiger nicht unterstützt, üben sie Neusprech. Was Java Referenzen nennt, entspricht genau dem, was hat wurden in der Vergangenheit immer als Zeiger bezeichnet.
Was Java nicht unterstützt, ist Zeigerarithmetik. Was ist etwas sonst ganz; Soweit ich weiß, sind C und seine Nachkommen die einzigen typisierte Sprachen, die Zeigerarithmetik unterstützen. Pascal und Modula-2, zum Beispiel, haben "Zeiger", wie Zeiger in ihren Spezifikationen, aber diese Zeiger haben eine Semantik, die der von Java-Referenzen; Sie erlauben keine Zeigerarithmetik.
Java hat Zeiger. Deshalb hat es eine NullPointerException. Es hat einfach keine Zeigermathematik. Jede Referenz auf ein Objekt ist eigentlich ein Zeiger, weshalb es Null sein kann. Das heißt, es gibt viele nützliche Programmiersprachen, die keine Zeiger haben, so dass jeder, der denkt, dass Zeiger für die Programmierung notwendig sind, eine sehr enge Sicht auf Programmiersprachen hat.
Lass mich sauer sein: Java hat keine Zeiger, weil Designer sich dafür entschieden haben, sie anders zu benennen. In der Tat haben sie alles auf dem Haufen verschoben, so dass alles durch einen Zeiger verwaltet wird, dann, da keine direkte Referenz mehr existiert, das "." und umbenannt "- & gt;" als "."
Die Java-Sprachspezifikation hat dazu folgendes zu sagen:
Java Sprachspezifikation §4.3.1
Die Referenzwerte (häufig nur Verweise) sind Zeiger für diese Objekte und eine spezielle Nullreferenz, die sich auf kein Objekt bezieht.
Für diejenigen, die Angst haben, in die Dokumentation einzutauchen, ist das Vorhandensein z.B. Java NullPointerException
sollte ein starker Hinweis darauf sein, dass Java Zeiger hat.
Kurz gesagt, die Frage ist bedeutungslos, weil sie auf einer völlig falschen Annahme beruht, dass, unter Berufung auf das OP, "Java keine Zeiger" - wie oben bewiesen - technisch Schwachsinn ist.
Siehe auch James Kanze's Antwort .
Diese Antwort kann am besten so angesehen werden, als würde sie nur die notwendigen Referenzen zu James 'Antwort liefern.
Prost & amp; hth.
Java hat tatsächlich eine Zeigermathematik. Es kommt mit sun.misc.Unsafe. Sie müssen das Speicher jedoch selbst verwalten - seien Sie vorsichtig.
Zeiger sind nur ein Weg, um eine Rückkehr zu machen. Sie sind nicht wirklich wichtig für effektive Arbeit. Es ist einfacher zu verwenden und Sie können den Code besser als mit Zeigern verstehen. In den meisten Quellcode in c sehe ich mehr & amp; / * / - & gt; als andere Dinge und du hast jemals gesucht, wenn du es brauchst.