Home > Kredit ohne Schufa > Felder in Java

Felder in Java

Solche Variablen haben viele Gemeinsamkeiten mit Objekten. Daher gehen wir in diesem Abschnitt auf einige Aspekte der OOP ein. Die Navigation: Array deklarieren; Array initialisieren; Zugriff auf Array-Felder. Die Feldvariablen enthalten eine Referenz auf ein Objekt. next. note. Einleitung zu Klassen und Objekten.

volumes

Es ist kein Schulbuch, sondern ein reinrassiges Schulbuch und richtet sich an alle, die ihre Java-Kenntnisse durch zahlreiche praktische Aufgaben durch Lernen durch Handeln erweitern und konsolidieren wollen. Er eignet sich hervorragend zur Vorbereitung auf eine Prüfung oder zum Üben der Programmierung mit Java. In jedem Abschnitt finden Sie zunächst eine kurze Übersicht über das in den einzelnen Kapiteln verwendete Material.

Sie können dann zwischen drei Schwierigkeitsgraden auswählen – von leicht bis hoch. Mit diesen Aufgabenstellungen können Sie Ihr Wissen in der Praxis erproben. Im Anschluss an dieses Kapitel erhalten Sie komplette und erläuterte Lösungsbeispiele.

Halbbilder (Arrays oder Vektoren)

In Feldern werden mehrere Variable eines Typs abgelegt, z.B. fünf Variable des Typs Int unter einem Namen. Eine einzelne Stelle in einem Spielfeld wird als Bestandteil bezeichnet. Dabei ist die Zahl der einzelnen Felder gleich der Feldgröße. Jedem Eintrag ist ein Register gemäß seiner Position im Eingabefeld beigefügt. Die Felder müssen erklärt, zugewiesen und parametrisiert werden.

In Java wird ein Eingabefeld als solches betrachtet und über Verweise geführt. Die Felder werden über Verweise bearbeitet. Die Felder werden mit Hilfe von neu. Die Felder werden vom Müllsammler beseitigt.

Initialisierungssicherheitsgarantie für Endfelder eines Referenztyps

Das ist das Handschrift eines Beitrags, der in einer Rubrik mit dem Namen „Effective Java“ im Java-Magazin auftauchte. In unserem letzen Artikel[JMM6 ] haben wir die Initialisierungssicherheitsgarantien des Java-Speichermodells für Endfelder diskutiert. Dies ist eine Gewähr dafür, dass alle Endfelder eines Objektes immer in ihrem ursprünglichen Status nach der Erstellung und niemals in ihrem ursprünglichen Ausführungszustand sind.

Welche Garantie gibt es für Endfelder eines Referenztyps? Sind auch die angesprochenen Gegenstände oder nur die Referenzen selbst ersichtlich? Startpunkt unserer Erörterung war die faule Feldinitialisierung mit der Racy-Einzelprüfsprache (siehe[JMM5 ]). Nachfolgend ein Beispiel mit einer Bezugnahme auf eine ganze Zahl vom Type java.lang. Das Referenzfeld wird nach der Installation nicht verändert.

Dazu möchten Sie das Spielfeld als endgültig erklären, was aber wegen der „faulen“ Initiierung nicht möglich ist. In der Enddeklaration der Bezugnahme würde sich sowieso nur auf die Anschrift des verwiesenen Objektes beziehen und nicht auf das zu referenzierende Teil. Dabei kann es vorkommen, dass zwei Threads zur gleichen Zeit „lazyField == null“ anzeigen und beide hintereinander den Anfangswert vorgeben.

Jede Änderung am referierten Gegenstand, die ein dritter Faden dazwischen gemacht hätte, wäre weg. Daher ist es von Bedeutung, dass nicht nur die Bezugnahme, sondern auch das zu referenzierende Element unveränderbar ist. D. h. die Racy-Einzelprüfungssprache ist nur dann Sinn, wenn es sich bei dem betreffenden Eingabefeld um eine unveränderbare Bezugnahme auf einen unveränderbaren Datentyp handelt.

Aus diesem Grund haben wir über unveränderbare Arten geredet und erkannt, dass alle Felder eines unveränderbaren Types für endgültig erklärt werden müssen; andernfalls gibt es Probleme mit der Übersicht. Eine unveränderbare Art muss auch die Sicht auf ihren Inhalt gewährleisten, d.h. sie muss dafür Sorge tragen, dass der unveränderbare Inhalt des Objektes nach der Erstellung für alle verwendenden Fäden ersichtlich wird.

Zur Sicherstellung der Transparenz erfordert die Umsetzung eines unveränderbaren Types die so genannte „Initialisierungssicherheit“ des Java-Speichermodells. Die “ Initialisierungssicherheit “ des Java-Speichermodells basiert auf der Tatsache, dass die Anfangswerte der Endfelder immer angezeigt werden und nie die Standardwerte. Falls ein Thema ein Objekt mit Endfeldern erkennt, weil es die Anschrift des Objektes erkennen kann, dann werden die Endfelder des Objektes immer im Ausgangszustand nach der Erstellung und nie im Standardzustand vor der Erstellung angezeigt.

Ein Beispiel mit einer Gruppe mit einem abschließenden Feld: privates abschließendes internes Eingabefeld; Feldname = initial; Rückgabe „[„+ Feldname +“]“;…. zuString( )); }; neuer Thread(r). start(); neuer Thread(r). start(); Beide Themen erhalten mit der Methoden getMyField() der Klassen“ MyClass“ die Verweisung auf das unveränderliche Objekt und können dann die Methoden toString() der Klassen “ Immutable“ auf dem unveränderlichen Objekt aufrufen.

Es kann dann sein, dass ein einziger Thread innerhalb der Methodik getMyField() die Bezugnahme auf das unveränderliche Halbbild immer noch als Null feststellt, da noch niemand die Lazy-Initialisierung für das Halbbild vorgenommen hat. Die anderen Threads können bereits eine andere als die Null finden und diese verwenden, um auf das unveränderliche Element zuzugreifen und seine toString()-Methode aufzurufen.

Hierbei ergibt sich die Fragestellung, in welchem Status der zweite Faden den Content des verwiesenen unveränderlichen Objektes sieht. Die Sicherheitsgarantie der Initialisierung gewährleistet, dass der zweite Thread das unveränderliche Element in seinem Initialisierungszustand sieht, da das Int-Field-Feld in der unveränderlichen Kategorie als endgültig erachtet wird.

Die Werte des Feldes int-Field sind 10000 und nicht etwa 0, wie es bei einer fehlenden Abschlussdeklaration der Fall sein könnte. ý privat end int[] endArrayRef; finaleArrayRef = neu int[size]; finalArrayRef[i] = start+i; zurück „[„+ arrays. toString(finalArrayRef) +“]; }; } Zuerst ist es offensichtlich, dass der zweite Faden die Adressen des Array sieht (und nicht Null), da die Bezugsvariable Final ArrayRef als endgültig erklärt wird.

Allerdings ergibt sich die Fragestellung, ob der Lesethread auch die einzelnen Bestandteile des Arrays erblicken kann. Das Java-Speichermodell bietet zum Glück solche Sicherheiten für die Array-Elemente. Für die Endfelder gilt die Gewährleistung nicht nur für die Endfelder selbst. Bei Endfeldern, die vom Typ Vorlage sind, ist gewährleistet, dass die Vorlage und alle „abhängigen“ Gegenstände angezeigt werden.

Als “ abhängige “ Gegenstände gelten diejenigen, die von einem letzten Bezugsfeld aus erreicht werden können, und alle Gegenstände, die von dort aus durch Bezug erreicht werden können. Das bedeutet die komplette Transitiv-Shell aller zugänglichen Daten. Im unter[ JMM2] beschriebenen SMP-Modell für den Java-Speicher kann man sich denken, dass am Ende der Erstellung eines Objektes mit Endfeldern ein Partial Flash angestoßen würde, bei dem die Endfelder des Objektes und alle „abhängigen“ Objektes in den Arbeitsspeicher zurück geschrieben werden.

Auf jeden Fall ist gewährleistet, dass alle Endfelder eines Objektes und alle von diesen Endfeldern aus zugänglichen Gegenstände für andere Themen angezeigt werden, bevor die Adressen des Objektes angezeigt werden und die anderen Themen auf die Endfelder Zugriff haben. Der unveränderliche Arraytyp wäre richtig implementiert: er hat keine ändernden Verfahren, alle seine Felder sind als endgültig erklärt und die Initialisierungssicherheit gewährleistet, dass auch die Array-Elemente ersichtlich sind.

Was ist, wenn der unveränderbare Type eine Verweisung auf ein Feld von Verweisen (anstelle von Primitivelementen ) hat? Durch die Sicherheitsgarantie der Initialisierung wird sichergestellt, dass auch die von den Array-Elementen angesprochenen Gegenstände und deren Inhalt einsehbar werden. Das, was wir hier am Beispiel einer letzten Bezugnahme auf ein Feld erklärt haben, trifft sinngemäß auch auf die letzte Bezugnahme auf ein Objekt zu.

Durch die Sicherheitsgarantie der Initialisierung wird sichergestellt, dass die komplette Transitivschale aller zugänglichen Gegenstände am Ende der Anlage ersichtlich ist. In dem Lesethread ist nur garantiert, dass er beim ersten Aufruf des Objekts vom Type Unabänderlich alle Daten der letzten Felder aus dem Arbeitsspeicher erhält. Außerdem erhält er die Daten aller abhängiger Gegenstände, so dass er seinen Arbeitsspeicher teilweise aus dem Arbeitsspeicher auffrischt.

Bei der letzten Referenzvariablen ist ohnehin kein Aktualisieren erforderlich, da die Adressierung des Feldes gleich bleibend ist und sich nicht mehr verändern kann. Eine Unveränderlichkeit des Feldes ist durch nichts garantiert, da die endgültige Erklärung der Array-Referenz nur besagt, dass die Arrayadresse gleich ist, nicht aber der Arrayinhalt selbst.

Das Java-Speichermodell gewährleistet nicht die Transparenz dieser Nachträge. Siehe wir uns das im Beispiel mal an: privates Finale int[] finaleArrayRef; finaleRef = neue int[size] ; finalArrayRef[i] = start+i ; zurück „[„+ Arrays. toString(finalArrayRef) +“]“““ ; finalArrayRef[idx] = value ; } } }. Dabei ist nicht gewährleistet, dass Lesethreads nach der Erstellung mit update() die Änderung der Array-Elemente durch andere Themenbereiche miterleben.

Lesethreads müssen ihren Speicher nur einmal auffrischen, wenn sie zum ersten Mal auf das letzte Eingabefeld und alle davon abgeleiteten Daten zugreifen. Änderungen an den später noch auftretenden Abhängigkeiten müssen nicht – können aber (z.B. durch zusätzliche Synchronisierungspunkte an völlig anderen Stellen) ersichtlich werden.

Falls sie gewährleistet sind, dass sie erkennbar werden, müssen andere Mittel (z.B. expliziter Abgleich) verwendet werden, um sie erkennbar zu machen. Beachten Sie, dass dieses Mißverständnis nicht bei gleichbleibenden Arten auftritt, da in einem gleichbleibenden Modus alle voneinander unabhängigen Elemente gleich sind. Daher ist es ausreichend, alle davon betroffenen Dateien beim ersten Aufruf aufzufrischen, da sich in den davon betroffenen Dateien nichts änder.

Mit finalen Führungsgrößen führt nur das Ende des Constructors zu einem Partial Flash und nur der erste Lesezugriff in jedem einzelnen Thread zu einem Partial Refresh. ý flüchtig ist daher als endgültig „teuer“, da mehr Speicherbarrieren getriggert werden und flüchtig keine Gewähr für abhängige Gegenstände hat. Ein weiterer Tipp für eventuelle Missverständnisse: „final“ ist nicht immer „final“.

Das Java-Speichermodell in Verbindung mit dem finalen gilt nur für finale Felder von Gegenständen, nicht für finale Variabel. Nicht umsonst werden die Lagereffekte für die Endlagerung als „Initialisierungssicherheit“ bezeichne. Garantiert ist nur, dass die Endfelder eines Objektes immer in ihrer ursprünglichen Gestalt ersichtlich sind.

Es gibt keine Garantie für andere Anwendungen von finalen (z.B. als Parametern und lokale Variable von Methoden). Betrachten wir einen Illustrationsfall, in dem finale Anwendung nichts mit Initialisierungssicherheit zu tun hat. endliche lange[] ArgumenteErgebnis = neue lange[2]; ArgumentAndResult[0] = Zeiten; langer Beginn = Anlage. nanoTime(); System.out. print(„*“); ArgumentAndResult[1] = Anlage. nanoTime()-start; }; Gewinde t = neuer Thread(r, „Drucker“); t.

Der Einsatz von Finale hat hier überhaupt nichts mit den oben diskutierten Speicher-Effekten für Endfelder zu tun, da wir hier keine Garantie im Hinblick auf Endvariablen benötigen. Dies bedeutet, dass der neugestartete Drucker-Thread sieht, was der Haupt-Thread getan hat. Ähnlich am Ende des Threads: Der Haupt-Thread erwartet mit dem Faden. join() auf das Ende des Drucker-Threads und kann dann alles erkennen, was der Drucker-Thread getan hat.

Bei der Threadendegarantie ist es von Bedeutung, dass sich ein Thema über das Ende des anderen Themas informieren konnte (via join() oder isAlive()). Wir haben in diesem Artikel die Initialisierungssicherheitsgarantie für Endfelder eines Referenztyps überprüft. Das bedeutet, dass die Endfelder eines Objektes immer für einen anderen Faden in ihrer vollständig in Initialisierung befindlichen Gestalt zu sehen sind, nie zuvor.

Außerdem sind alle davon betroffenen Elemente in ihrer initialen Version ersichtlich. Dies gilt nur für Endfelder und nicht für Endvariablen. Für die Umsetzung von unveränderbaren Arten wird die Gewährleistung „Initialisierungssicherheit“ verwendet: In einem unveränderbaren Fall müssen alle Felder als endgültig erklärt werden und alle davon abhängigen Gegenstände müssen selbst unveränderbar sein.

Der nächste Artikel wird zeigen, was bei der Umsetzung von unveränderbaren Arten trotz des Einsatzes von finalen. Eine ganze Reihe über das Java-Speichermodell::

Leave a Reply

Your email address will not be published.

Ja, auch diese Webseite verwendet Cookies. Hier erfahrt ihr alles zum Datenschutz