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?
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
- jeśli Referencja nie jest
null
, nie ma znaczenia jaki jest typ runtime obiektu, nie ma dynamicznej wysyłki!!!
null
, ponieważ żadna instancja nie jest wymagana
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
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.
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.
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ę.
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 .
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