Ich habe die folgenden zwei Objektvariablen
Date a;
Date b=null;
Auf jeden Fall beziehen sich sowohl 'a' als auch 'b' nicht auf Objekte.
Nun, wenn ich folgende Aussage aufrufe
System.out.println(a.toString());
Es wird ein Fehler bei der Kompilierung auftreten, wenn ich die folgende Anweisung aufrufe
System.out.println(b.toString());
Es wird kein Kompilierungsfehler auftreten, aber es wird ein Laufzeitfehler auftreten. Was ist der Grund dafür und welcher Wert wird tatsächlich in 'b' gespeichert, um einen Nullwert darzustellen?
Antworten:
Dies liegt daran, dass der Status lokaler Variablen innerhalb seines Bereichs gesteuert wird
Was bei Feldern nicht der Fall ist
Warum ist es in Ordnung, eine Variable auf null zu setzen und sie sofort zu verwenden? Vielleicht ist das ein historischer Fehler, der manchmal zu schrecklichen Fehlern führt
Was ist nun der semantische Unterschied?
gerade erklärt Variable, die eine Referenz, die auf ein Objekt des Typs aufnehmen kann
Date
jedochmacht genau das gleiche, aber die Referenz zeigt diesmal auf null, null ist wie jede Referenz, es nimmt ein Leerzeichen eines nativen Zeigers ein, dh 4 Byte auf 32-Bit-Maschinen und 8 Byte auf 64-Bit-Maschinen
quelle
Es gibt keinen Unterschied für Klassenfelder. Sie sind
null
standardmäßig für Objekte, 0 für numerische Werte undfalse
für Boolesche Werte .Für in Methoden deklarierte Variablen erfordert Java, dass sie initialisiert werden. Wenn sie nicht initialisiert werden, tritt beim Zugriff auf die Kompilierung ein Fehler auf.
Was ist der Grund? Klassenfelder können mit jeder Methode geändert werden. In beliebiger Reihenfolge wird die Methode aufgerufen. Alle nicht privaten Felder können von anderen Klassen und / oder Klassen geändert werden, die diese Klasse erweitern. Daher macht es keinen Sinn, über eine nicht initialisierte Variable zu informieren, da sie an vielen, vielen Stellen zugewiesen werden kann.
Variablen in Methoden sind jedoch lokal und können nur innerhalb der Methode selbst geändert werden. Daher ist es sowohl möglich als auch rational, mögliche Fehler aufzuzeigen. Und der Compiler versucht es. Wenn es weiß, dass das Feld nicht initialisiert ist, wird ein Fehler angezeigt, da dies niemals gewünscht wird. Wenn es nicht sicher ist, wird eine Warnung ausgegeben, damit Sie sich vergewissern können.
quelle