Dlaczego wywołanie (statycznej) metody na referencji null nie powoduje wywołania NullPointerException?

Napisałem ten program w Javie

public class Why {

  public static void test() {
    System.out.println("Passed");
  }

  public static void main(String[] args) {
    Why NULL = null;
    NULL.test();
  }

}

Czytałem, że wywołanie metody na obiekcie null powoduje NullPointerException, A jednak powyższy program nie? Dlaczego? Nie rozumiem czegoś poprawnie?

Author: polygenelubricants, 2010-07-20

5 answers

test() jest metodą static. Element static należy do tego typu i nie wymaga dostępu do instancji.

A static członek powinien tylko być dostępny poprzez wyrażenie typu. Oznacza to, że powinieneś napisać to w następujący sposób:

Why.test(); // always invoke static method on the type it belongs to!

Java umożliwia dostęp do elementu static za pomocą wyrażenia odniesienia do obiektu, ale to jest bardzo wprowadzające w błąd, ponieważ jest to , a nie faktyczna semantyka dostępu członka static.

Why aNull = null; 
aNull.test(); // DO NOT EVER DO THIS!
// invokes Why.test(), does NOT throw NullPointerException

Przy dostępie element static poprzez Object reference expression, liczy się tylko zadeklarowany Typ referencji. Oznacza to, że:

    Nie ma znaczenia, czy Referencja jest rzeczywiście null, ponieważ żadna instancja nie jest wymagana
  • jeśli Referencja nie jest null, nie ma znaczenia jaki jest typ runtime obiektu, nie ma dynamicznej wysyłki!!!

Jak widzisz, dokładne przeciwieństwa są prawdziwe w obu punktach, na przykład w dostępie do członka. To dlatego static członkowie powinni nigdy być dostępni w sposób " nie-static", ponieważ daje to bardzo mylący wygląd na to, co faktycznie robi.

Podobne pytania

 81
Author: polygenelubricants,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:27:46

Statyczne metody nie wymagają odniesienia do obiektu. Można więc nazwać go nawet odniesieniem do obiektu jest null. Tak działa główna metoda.

Spróbuj usunąć statyczne oznaczenie z obiektu, aby zobaczyć wyjątek wskaźnika null.

 4
Author: Vlad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-20 19:02:56

Jest to statyczna metoda, która pozwala na wywołanie metod bez tworzenia instancji instancji.

 3
Author: JohnFx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-20 19:03:04

Należy włączyć różne ostrzeżenia w IDE. Prawdopodobnie zobaczysz ostrzeżenie o dostępie do statycznego członka w niestatyczny sposób.

Możesz zrobić coś takiego jak (Why) (null).test (), używa tylko(Why) (null), aby uzyskać klasę.

 3
Author: MrJacqes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-20 19:46:40

Statyczna zmienna i metody są powiązane z klasą, A nie z jakimkolwiek obiektem. Każda instancja klasy dzieli zmienną klasy, która znajduje się w jednym stałym miejscu w pamięci.

Każdy obiekt może zmienić wartość zmiennej klasy, ale zmienne klasy mogą być również manipulowane bez tworzenia instancji klasy i to samo dotyczy metody statycznej. więcej Zobacz to .

 1
Author: Rupesh Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 09:29:38