Alles in Java wird als Objekt betrachtet, und das Operationsobjekt ist tatsächlich eine „Referenz“ des Operationsobjekts. Die Beziehung zwischen den beiden entspricht der Verwendung der Fernbedienung (Referenz) zur Bedienung des Fernsehers (Objekts). Um eine Referenz zu haben, muss nicht unbedingt ein Objekt damit verknüpft sein, z. B. wenn Sting einfach erklärt, dass eine Referenz nicht mit einem Objekt verknüpft ist.
Sobald Sie eine Referenz erstellt haben, möchten Sie diese mit einem Objekt verknüpfen. Normalerweise verwenden Sie new, um ein neues Objekt zu erstellen (Strings in Java können erstellt werden). mit zitierter Textinitialisierung).
(1) Registrieren. Der schnellste Speicherbereich (innerhalb des Prozessors) kann in Java nicht direkt von Menschen gesteuert werden (c++/c ermöglicht es Ihnen, dem Compiler Registerzuordnungsmethoden vorzuschlagen).
(2) Stapel. Der Stapelzeiger befindet sich im RAM und bewegt sich nach unten, um neuen Speicher zuzuweisen, und nach oben, um Speicher freizugeben. Dies ist sehr schnell und wird nur von den Registern übertroffen. Beim Erstellen des Systems muss das Java-System jedoch den genauen Deklarationszeitraum aller im Stapel gespeicherten Elemente kennen, um den Zeiger nach oben und unten bewegen zu können. Diese Einschränkung schränkt die Flexibilität des Programms ein. Einige grundlegende Arten von Variablen und Objektreferenzen (Java-Objekte gehören nicht dazu) werden auf dem Stapel gespeichert.
(3) Haufen. Ein allgemeiner Speicherpool (im RAM), der zum Speichern aller Java-Objekte verwendet wird. Der Vorteil des Heaps besteht darin, dass er sich vom Stapel unterscheidet: Der Compiler muss nicht wissen, wie lange die im Heap gespeicherten Daten überleben. Wenn ein neues Objekt erstellt wird, wird im Heap automatisch Speicher für die Speicherung zugewiesen. Der Compiler recycelt das Objekt automatisch, wenn es ohne menschliche Kontrolle nicht mehr benötigt wird. Diese Flexibilität hat natürlich ihren Preis: Das Erstellen von Objekten auf dem Stapel dauert länger als in C/C++.
(4) Ständige Lagerung. Konstante Werte werden normalerweise direkt im Programmcode gespeichert, da sich konstante Werte nie ändern.
(5) Nicht-RAM-Speicher. Die Daten liegen außerhalb des Programms und unterliegen keiner Kontrolle durch das Programm. Wie Stream-Objekte und persistente Objekte.
Eine Reihe von Typen, die häufig in der Programmierung verwendet werden, wie z. B. Ganzzahlen, Dezimalzahlen, Zeichen ... Diese Typen werden als Grundtypen bezeichnet und unterliegen einer Sonderbehandlung.
Warum sollten wir besonders behandelt werden? new speichert Objekte im Heap. Wie bereits erwähnt, dauert die Speicherung von Daten im Heap länger, sodass für diese häufig verwendeten, insbesondere kleinen, einfachen Daten die Kosten für die Speicherung im Heap zu hoch sind. Daher verwendet Java nicht new zum Erstellen von Variablen, sondern erstellt eine „automatische“ Variable, die keine Referenz ist. Diese Variable speichert den Wert direkt und legt ihn auf dem Stapel ab. Der von Grundtypen belegte Speicherplatz ist festgelegt.
Um sich an die Tatsache anzupassen, dass alles ein Objekt ist, verfügen Basistypen über eine Wrapper-Klasse, sodass im Heap ein Nicht-Basisobjekt erstellt werden kann, das den entsprechenden Basistyp darstellt.
Zum Beispiel:
char c='a'; Character ch=new Character(c); 或者 Character ch=new Character('a');
Die automatische Verpackungsfunktion in Java se5 kann automatisch zwischen den beiden konvertieren.
Variablenbereich: Variablen umfassen Basistypen und Klassenreferenzen, die Werte direkt speichern. Überlebt nur innerhalb des Codesegments.
Objektumfang:
{ String s=new String("string"); }//end of scope
Die Referenz s wird auf dem Stapel gespeichert und endet am Ende des Geltungsbereichs. Das String-Objekt, auf das s zeigt, verbleibt jedoch weiterhin im Heap. Es liegt am Garbage Collector von Java, zu bestimmen, wann das Objekt recycelt werden soll. Dadurch werden die meisten „Speicherverlust“-Probleme beseitigt.
Java unterscheidet sich von c/c++ Viele Menschen sind verwirrt darüber, ob Java-Methodenparameter als Wert oder als Referenz übergeben werden. Für Basisdatentypen werden Werte übergeben, da Basisdaten Werte direkt im Stapelbereich speichern. Das Objekt wird als Referenz übergeben (die Objektreferenz im Stapelbereich ist die Adresse des Objekts im Heap-Bereich). Nehmen Sie zur Veranschaulichung String und StringBuilder.
Sehen Sie sich unten zwei Beispiele an.
public class Test {public static void test(String str) { str = "world"+str; }public static void main(String[] args) { String str1 = new String("hello"); test(str1); System.out.println(str1); } }
Das Ausgabeergebnis des obigen Beispiels ist immer noch Hallo, warum? Da die Änderung an str im Test keine Änderung am ursprünglichen Objekt darstellt, betrifft dies die Eigenschaften des String-Objekts, nachdem es erstellt wurde. Die obige Änderung lautet eigentlich: Erstellen Sie einen leeren StringBuilder und rufen Sie ihn dann auf die append-Methode, um es „world“ und str einzufügen, und rufen Sie dann die toString-Methode auf, um ein neues String-Objekt zu erstellen. Daher ist das Referenzobjekt von str zu diesem Zeitpunkt bereits brandneu, sodass sich str1 in der Hauptfunktion nicht geändert hat. Schauen wir uns ein weiteres Beispiel für StringBuilder an.
public class test1 { static void test(StringBuilder str){ str.append("1234"); } public static void main(String[] args) { StringBuilder a=new StringBuilder("abc"); test(a); System.out.println(a.toString()); } }
Das obige Ausgabeergebnis abc1234, die Änderung an str im Test, wirkt sich auch auf a aus, da die Referenzen von str und a auf dasselbe StringBuilder-Objekt verweisen und StringBuilder dies kann Geändert. Es genügt zu zeigen, dass es sich bei der übergebenen Referenz um eine Referenz handelt.
Das obige ist der detaillierte Inhalt vonAlles in Java ist ein Objekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!