static
Mitglieder ( static
Felder oder static
Methoden) in Java sind eher ihrer jeweiligen Klasse als den Objekten dieser Klasse zugeordnet. Der folgende Code versucht, auf ein statisches Feld in einer null
Referenz zuzugreifen .
public class Main
{
private static final int value = 10;
public Main getNull()
{
return null;
}
public static void main(String[] args)
{
Main main=new Main();
System.out.println("value = "+main.getNull().value);
}
}
Obwohl main.getNull()
zurückgegeben null
, funktioniert es und wird angezeigt value = 10
. Wie funktioniert dieser Code?
Main main = null; main.getNull().value
.new Thread[]{}[-1].sleep(10);
wo sleep () eine statische Methode ist. Dies war früher bei einigen älteren Java-Versionen erfolgreich.Antworten:
Dieses Verhalten ist in der Java-Sprachspezifikation angegeben :
Im Einzelnen funktioniert eine statische Feldauswertung wie
Primary.staticField
folgt (Hervorhebung von mir) - in Ihrem FallPrimary = main.getNull()
:quelle
Denn wie Sie sagten, sind statische Felder keiner Instanz zugeordnet.
Die Möglichkeit, über eine Instanzreferenz (wie Sie es tun) auf statische Felder zuzugreifen, ist lediglich ein syntaktischer Zucker und hat keine zusätzliche Bedeutung.
Ihr Code wird zu kompiliert
quelle
Wenn Sie zur Kompilierungszeit auf eine statische Variable oder Methode mit Objekten zugreifen, wird diese in den Klassennamen konvertiert. z.B:
Der Wert der statischen Variablen wird gedruckt, da er zur Kompilierungszeit in konvertiert wird
Beweis:
Laden Sie den Dekompiler herunter und dekompilieren Sie Ihre .class-Datei in eine .java-Datei. Sie können sehen, dass alle statischen Methoden oder variablenbezogenen Objektnamen automatisch durch den Klassennamen ersetzt werden.
quelle
Der Zugriff auf ein
static
Mitglied mit dem Klassennamen ist legal, es wurde jedoch nicht geschrieben, dassstatic
mit der Objektreferenzvariablen nicht auf das Mitglied zugegriffen werden kann. Also funktioniert es hier drüben.Eine
null
Objektreferenzvariable kann auf einestatic
Klassenvariable zugreifen , ohne beim Kompilieren oder zur Laufzeit eine Ausnahme auszulösen.quelle
Statische Variable und Methode gehören immer zur Klasse. Wenn wir also ein Objekt erstellen, werden nur nicht statische Variablen und Methoden zusammen mit dem Objekt gehäuft, aber statisch befindet sich im Methodenbereich mit Klasse. Wenn wir versuchen, auf eine statische Variable oder Methode zuzugreifen, wird diese in einen Klassennamen, eine Punktvariable oder einen Methodennamen konvertiert.
Weitere Informationen finden Sie unter dem folgenden Link.
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
quelle