static
elementy członkowskie ( static
pola lub static
metody) w Javie są skojarzone z odpowiednimi klasami, a nie z obiektami tej klasy. Poniższy kod próbuje uzyskać dostęp do pola statycznego w null
odwołaniu.
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);
}
}
Chociaż main.getNull()
zwraca null
, działa i wyświetla value = 10
. Jak działa ten kod?
Main main = null; main.getNull().value
.new Thread[]{}[-1].sleep(10);
gdzie sleep () jest metodą statyczną. Kiedyś działało to pomyślnie w niektórych starszych wersjach Java.Odpowiedzi:
To zachowanie jest określone w specyfikacji języka Java :
Bardziej szczegółowo, statyczna ocena pola , na przykład
Primary.staticField
działa w następujący sposób (wyróżnienie moje) - w Twoim przypadkuPrimary = main.getNull()
:źródło
Ponieważ, jak powiedziałeś, pola statyczne nie są powiązane z instancją.
Możliwość dostępu do pól statycznych z odwołania do instancji (tak jak to robisz) jest jedynie cukrem syntaktycznym i nie ma dodatkowego znaczenia.
Twój kod kompiluje się do
źródło
Kiedykolwiek uzyskujesz dostęp do zmiennej statycznej lub metody z obiektami w czasie kompilacji, jest ona konwertowana na nazwę klasy. na przykład:
Wyświetli wartość zmiennej statycznej, ponieważ w czasie kompilacji zostanie przekonwertowana na
Dowód:
pobierz dekompilator i Zdekompiluj swój plik .class do pliku .java, a zobaczysz, że wszystkie metody statyczne lub zmienna nazwa obiektu jest automatycznie zastępowana nazwą klasy.
źródło
Dostęp do
static
elementu członkowskiego z nazwą klasy jest dozwolony, ale nie napisano, że nie można uzyskać dostępu dostatic
elementu członkowskiego za pomocą zmiennej odwołania do obiektu. Więc to działa tutaj.null
Zmienna odwołanie do obiektu może uzyskać dostęp dostatic
zmiennej klasy nie rzucając wyjątek albo w czasie kompilacji i czasie wykonywania.źródło
Zmienna statyczna i metoda zawsze należą do klasy. Więc kiedy kiedykolwiek tworzymy dowolny obiekt, tylko zmienna niestatyczna i metody idą na stos wraz z obiektem, ale statyczne rezyduje w obszarze metod z klasą. Dlatego kiedykolwiek próbujemy uzyskać dostęp do zmiennej statycznej lub metody, jest ona konwertowana na zmienną kropkową nazwę klasy lub nazwę metody.
Więcej informacji można znaleźć w poniższym linku.
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
źródło