Hat Java pointers?

Wenn Java keine pointers hat, was macht dann das new Schlüsselwort in Java?

   

Wie bereits erwähnt, hat Java Referenzen. Wie unterscheiden sich diese?

  1. Sie können keine arithmetischen oder andere solche Operationen an diesen durchführen
  2. Sie zeigen nicht auf den Speicher, der das Objekt enthält (dh sie sind keine pointers mit einem anderen Namen). Es steht der JVM frei, Objekte innerhalb des VM-Speichers zu verschieben und höchstwahrscheinlich während der Speicherbereinigung. Die Referenzen verweisen jedoch immer noch auf dieses Objekt, trotz seiner Bewegung innerhalb der Erinnerung.

Sie sind also nicht wie C ++ Referenzen (zeigt direkt auf ein Objekt). Vielleicht würde ein besserer Name behandelt werden .

Java hat keine pointers; Java hat Referenzen.

Es ist ein guter Punkt, aber ein pointers weist zusätzliche Operationen auf, die Sie normalerweise verwenden können (oder auch nicht). Eine Referenz fehlt diese Operationen, weil die Operationen möglicherweise unsicher sind.

Wenn Sie beispielsweise einen pointers verwenden, um das erste Element eines Arrays wie folgt zu indizieren:

 int squares[] = {1, 4, 9, 16, 25, 36, 49}; int* intPointer = squares; 

Vielleicht möchten Sie den pointers dereferenzieren und den Wert “1” erhalten, aber Sie können auch:

 intPointer++ 

und nachdem du das gemacht hast, bekommst du den Wert “4”, wenn du den pointers dereferenzierst. Eine Sekunde

 intPointer++; 

Will, wenn dereferenziert, geben Sie den Wert “9”. Dies liegt daran, dass die Operation ++ den pointers im Speicher eine “Einheit” vorausbewegt.

Das Problem rührt von den Schwächen des C / C ++ – Typ-Prüfsystems her (C ++ muss die Kompatibilität mit C aufrechterhalten, so dass dieselben Probleme auftreten). Der pointers speichert eine Adresse im Speicher und die Operation ++ fügt der Adresse die entsprechende Anzahl von Bytes hinzu. Auf vielen Systemen fügt ++ ing ein int vier Bytes hinzu, aber wenn der pointers ein char-pointers war, sollte er nur ein Byte hinzufügen. Beachten Sie, dass, da der zugrunde liegende Datentyp eines pointerss eine Adresse im Speicher ist, Folgendes zulässig ist (aber nicht empfohlen):

 char* charPointer = squares; charPointer++; void* voidPointer = squares; voidPointer++; 

Da pointers Adressen im Speicher sind, stellen sie möglicherweise (richtig) jedes Speicherbit im Computer dar, aber sie werden nur dann richtig dereferenziert, wenn die zugrunde liegenden Daten den Typ und die Ausrichtung des pointerss miteinander verknüpfen. Für pointers, die nicht durch viel Code verwaltet werden, um sie sicher zu machen, bedeutet dies, dass Sie möglicherweise den Datentyp (oder die Ausrichtung) der gewünschten Informationen verlassen und eine Dereferenzierung im Katastrophenfall enden kann. Der Versuch, dieses Problem mit benutzerdefiniertem Code zu beheben, führt dazu, dass ein pointers so stark abgebremst wird, dass performancesprobleme auftreten, und er öffnet die Möglichkeit, Fehler im benutzerdefinierten Code für die pointersverwaltung hinzuzufügen.

Die Java-Seite führt alle diese Probleme durch, indem sie eine Referenz zurückgibt. Eine Referenz bezieht sich nicht auf einen Ort im Speicher; Java unterhält eine interne “Referenz auf pointers” -Tabelle. Diese Tabelle übernimmt die Referenz und gibt die zugehörigen Daten zurück, unabhängig davon, wo sich diese Daten im Speicher befinden. Dies verlangsamt die Codeausführung, da für jede “Dereferenzierung” zwei Nachschlagevorgänge durchgeführt werden, ein Nachschlagevorgang in der Referenztabelle und einer im Maschinenspeicher.

Ein großer Vorteil von Java, dass Verweise verwendet, ist, dass der Speicher verschoben werden kann, ohne die potenziellen pointersadressen zu unterbrechen. Wenn Sie in einem C-Programm Daten in einen neuen Speicherort verschieben, ist es sehr schwierig zu wissen, ob ein anderer Teil des Programms einen pointers auf die Daten hat. Wenn ein veralteter pointers nach dem Verschieben des Speichers dereferenziert wird, greift das Programm auf beschädigte Daten zu, und in der Regel ist ein Absturz ein Mangel.

Die Fähigkeit, den Speicher in einem laufenden Programm zu verschieben, ermöglicht es Programmen, Speicher einfach zu recyceln. Jedes Programm, das keine Speicherblöcke benötigt, kann den unbenutzten Speicher freisetzen, aber dies erzeugt Speicherlöcher ungenutzten Speichers zwischen Teilen des verwendeten Speichers. Intern verwenden Computer Seiten des Speichers, die ziemlich groß sind. Wenn eine wenig genutzte Speicherseite die wenigen verwendeten Bits in eine andere Seite verschieben könnte, kann eine Speicherseite freigegeben werden. Dies erhöht die Dichte der Daten zum Speicher und verbessert die Cache-performance. Manchmal führt dies zu performancesverbesserungen, die ziemlich dramatisch sein können.

Garbage Collector von Java nutzt die Verwendung von Referenzen, indem es den Zugriff auf die Daten für einen Satz von Referenzen vorübergehend blockiert. Während dieser Blockierung des Zugriffs bewegt es die Daten herum (um sie zu komprimieren). Nach der Blockierung hat der Verweis auf die Adresstabelle die neuen Speicheradressen. Da die “funktionale” Ebene des Codes die Adressen an erster Stelle nie kannte, wird diese Operation ein laufendes Java-Programm nicht unterbrechen.

Java hat pointers im Sinne von Variablen, die Verweise auf Daten im Speicher speichern. Alle Variablen von Objekttypen in Java sind pointers in diesem Sinne.

Die Java-Sprache erlaubt jedoch keine arithmetischen Operationen an den Werten von pointersn, wie Sie es in einer Sprache wie C machen könnten.

new macht (grob) folgendes:

  1. Suchen Sie nach einem zusammenhängenden freien Block des Heapspeichers, der der Instanzgröße der von Ihnen erstellten class entspricht, sowie etwas Platz für die Buchhaltung
  2. Nullen Sie das Leerzeichen und entfernen Sie es aus der freien Liste
  3. Führen Sie den Konstruktor aus
  4. Geben Sie eine Referenz (NICHT einen pointers, wie andere Posts erläutert haben) an die erstellte Instanz zurück.

java.lang.NullPointerException

Die Leute sagten mir, “dass Java keine Hinweise hat” in Interviews. Normalerweise gab ich ihnen einen Java-Code und ließ sie erklären, was in diesem Code passiert:

 public class TestPointers { public static void main(String args[]) { Object p1, p2; p1 = new Object(); p2 = p1; p1 = null; System.out.println(p2); } } 

Java hat Referenzen. Auf alle Objekte wird zugegriffen, indem Verweise auf ihre Instanzen vorhanden sind. Sie erstellen eine neue Instanz mit new , die einen Verweis auf das Objekt zurückgibt.

Java-Verweise sind nicht wie pointers in C, Sie können nicht im Rohspeicher, der das Objekt bildet, “unter die Haube schauen”.

Java hat keine pointers. Der Operator “new” wird für die Referenzvariable in Java verwendet.

new in Java gibt einen Verweis auf das neu erstellte Objekt zurück.

neue Rückkehrreferenz. Es hat einige Ähnlichkeiten mit pointersn (wenn Sie zur function übergehen, wird die Referenz übergeben, genau wie beim pointers), aber es gibt keine pointersarithmetik.

Java unterstützt oder erlaubt keine pointers. (Oder genauer, Java unterstützt keine pointers, auf die der Programmierer zugreifen und / oder sie ändern kann.) Java kann keine pointers zulassen, da Java-Applets dadurch die Firewall zwischen der Java-Ausführungsumgebung und dem Host-Computer durchbrechen könnten. (Denken Sie daran, dass einem pointers eine beliebige Adresse im Speicher zugewiesen werden kann – sogar Adressen, die außerhalb des Java-Laufzeitsystems liegen.)

Java hat pointers, die unter dem Namen ” reference ” bekannt sind.

Wenn Leute sagen “Java hat keine pointers”, verwechseln sie typischerweise das Konzept eines pointerss mit der spezifischen Implementierung und den Fähigkeiten von pointersn, die in von C und C abgeleiteten Sprachen gefunden werden.

Bestimmtes:

  • Java-Referenzen können nicht auf eine beliebige Adresse gesetzt werden . Noch kann (Standard) Pascal noch Fortran pointers.
  • Java-Referenzen können nicht so eingestellt werden, dass sie auf eine Variable zeigen . Noch können Pascal pointers (Standard).
  • Java-Verweise unterstützen keine pointersarithmetik . Auch keine Pascal- oder Fortran-pointers
  • Java-Referenzen können nicht auf Teile eines Objekts zeigen (wie das dritte Element eines Arrays). Noch können Pascal pointers.

Im Gegensatz zu weit verbreiteten Annahmen ist ein pointers nicht unbedingt eine Adresse . Ein pointers wird normalerweise als eine Adresse implementiert, aber das ist nicht erforderlich, nicht einmal in C oder C ++.

In Java stoßen wir nur auf DIESEN pointers, es wird verwendet, um die Variablen der gleichen class zu verweisen. Der Operator new wird als Referenz auf ein Objekt verwendet.