Referenzen können durch Speichern der Adresse implementiert werden. In der Regel werden Java-Referenzen als Zeiger implementiert, dies ist jedoch in der Spezifikation nicht erforderlich. Möglicherweise verwenden sie eine zusätzliche Indirektionsebene, um die Garbage Collection zu vereinfachen. Am Ende kommt es jedoch (fast immer) darauf an, dass (C-artige) Zeiger an der Implementierung von (Java-artigen) Referenzen beteiligt sind.
Sie können mit Referenzen keine Zeigerarithmetik ausführen. Der wichtigste Unterschied zwischen einem Zeiger in C und einer Referenz in Java besteht darin, dass Sie den zugrunde liegenden Wert einer Referenz in Java tatsächlich nicht ermitteln (und bearbeiten) können. Mit anderen Worten: Sie können keine Zeigerarithmetik ausführen.
In C können Sie einem Zeiger (dh der Adresse) etwas hinzufügen oder etwas subtrahieren, um auf "nahe" liegende Objekte oder Orte zu verweisen, die sich an einem beliebigen Ort befinden.
In Java verweist ein Verweis auf eine Sache und nur auf diese Sache. Sie können festlegen, dass eine Variable einen anderen Verweis enthält, aber Sie können sie nicht einfach bitten, auf "das Objekt nach dem ursprünglichen Objekt" zu verweisen.
Referenzen sind stark typisiert. Ein weiterer Unterschied besteht darin, dass der Typ einer Referenz in Java viel strenger gesteuert wird als der Typ eines Zeigers in C. In C können Sie ein haben int*
und es in ein char*
umwandeln und den Speicher an dieser Stelle einfach neu interpretieren. Diese Neuinterpretation funktioniert in Java nicht: Sie können das Objekt am anderen Ende der Referenz nur als etwas interpretieren, das es bereits ist (dh Sie können eine Referenz nur dann auf eine Object
Referenz String
umwandeln , wenn das Objekt, auf das verwiesen wird, tatsächlich eine ist String
).
Diese Unterschiede machen C-Zeiger leistungsfähiger, aber auch gefährlicher. Beide Möglichkeiten (Zeigerarithmetik und Neuinterpretation der Werte, auf die verwiesen wird) verleihen C Flexibilität und sind die Quelle für einen Teil der Macht der Sprache. Sie sind jedoch auch eine große Problemquelle, da sie bei falscher Verwendung leicht die Annahme aufheben können, dass Ihr Code darauf aufgebaut ist. Und es ist ziemlich einfach, sie falsch zu benutzen.