Kann ich in der Praxis davon ausgehen, dass alle int-Arrays in Java mit Nullen gefüllt beginnen? für alle Maschinen, auf denen die JVM läuft?
Gilt das für alle Typen? verkohlen? Boolescher Wert? Aufzählungen?
Wo ist das offiziell dokumentiert?
In den Lehrbüchern, die ich habe, heißt es, dass int-Arrays auf Null gesetzt sind, aber sie empfehlen auch, eine for-Schleife zu schreiben, um alle Werte auf Null zu setzen, nur "um klarer zu sein".
Arrays.fill(myArr, 0)
. Aber es ist immer noch ein lächerlicher Vorschlag. Wenn es um Klarheit geht, geben Sie einen verdammten Kommentar ein. Machen Sie keine unnötige Arbeit.Antworten:
Die Java-Sprachspezifikation ist der richtige Ort, um nach solchen Informationen zu suchen:
Die Standardwerte selbst sind in Abschnitt 4.12.5 angegeben .
quelle
Ja. Primitive Typen in Java werden immer mit Null initialisiert. Referenzen werden ebenfalls auf null initialisiert.
quelle
Es sollte sich um eine Java-Sprachspezifikation handeln. §4.12.5 Anfangswerte von Variablen . anstelle von §4.5.5
"Für Typ Byte ist der Standardwert Null, dh der Wert von (Byte) 0.
Für Typ Short ist der Standardwert Null, dh der Wert von (Kurz) 0.
Für Typ Int ist der Standardwert ist Null,
dh 0. Für den Typ long ist der Standardwert Null, dh 0L.
Für den Typ float ist der Standardwert positiv Null, dh 0.0f.
Für den Typ double ist der Standardwert positiv Null Das heißt, 0.0d.
Für den Typ char ist der Standardwert das Nullzeichen, dh '\ u0000'.
Für den Typ boolean ist der Standardwert false.
Für alle Referenztypen (§4.3) ist der Standardwert Null."
quelle
Dein Lehrbuch ist falsch! Das Schreiben eines solchen Codes ist sinnlos und es ist eine Verschwendung Ihrer Zeit, ihn einzugeben, und der Computerzeit, ihn auszuführen.
Wie bereits erwähnt, garantiert der Compiler, dass Variablen außerhalb von Methoden (Klassen- / Instanzvariablen) den Wert 0, false oder null erhalten. Wie Sie wahrscheinlich wissen, gibt der Compiler keine Variablen innerhalb von Methodenwerten an und zwingt Sie stattdessen, ihnen einen Wert zu geben, bevor sie verwendet werden.
Wenn Sie die Dinge "richtig" machen, werden Sie feststellen, dass sich etwa 90% bis 95% Ihrer "Variablen" niemals ändern, nachdem ihnen ein Wert zugewiesen wurde. Neue Programmierer neigen jedoch dazu, solche Dinge zu tun:
int x = 0; // some code that never uses x x = 5; // more code that only reads x and never modifies it.
Dies verhindert, dass Sie x als "final" markieren können. Wenn Sie x als "final" markieren können, wird eine versehentliche Änderung des Werts verhindert, wodurch Fehler vermieden werden.
Ich würde den Code wie folgt schreiben:
final int x; // some code that never uses x x = 5; // more code that only reads x and never modifies it.
Dies wird als leeres Finale bezeichnet (eine endgültige Variable, die beim Deklarieren keinen Wert hat).
Wenn Sie sich daran erinnern, dass Klassen- / Instanzvariablen zur Laufzeit initialisiert werden, schreiben Sie hoffentlich keinen Code, um sie mit Wegwerfwerten zu initialisieren, und können sie dann als endgültig markieren.
Meine persönliche Praxis besteht darin, alles immer als endgültig zu markieren, bis ich feststelle, dass ich es ändern muss, und eine Variable niemals zu initialisieren, bis ich den tatsächlichen Wert kenne, den sie haben soll. Dadurch wird der Code schneller (nicht erkennbar, da Zuweisungen im Allgemeinen sehr schnell sind) und sicherer, da ich einen Wert selten versehentlich ändere, wenn ich dies nicht sollte.
quelle