Co to jest null
?
Czy null
jest na przykład coś?
Do jakiego zestawu null
należy?
Jak jest reprezentowany w pamięci?
java
null
terminology
unj2
źródło
źródło
Odpowiedzi:
Nie, nie ma typu, który
null
byłbyinstanceof
.15.20.2 Operator porównania typów
instanceof
Oznacza to, że dla każdego typu
E
iR
dla dowolnegoE o
, gdzieo == null
,o instanceof R
jest zawszefalse
.JLS 4.1 Rodzaje typów i wartości
Jak mówi powyższy cytat JLS, w praktyce możesz po prostu udawać, że to „zwykły literał, który może być dowolnego rodzaju odniesienia”.
W Javie
null == null
(nie zawsze tak jest w innych językach). Należy również pamiętać, że zgodnie z umową ma również tę specjalną właściwość (zjava.lang.Object
):Jest to również wartość domyślna (dla zmiennych, które je mają) dla wszystkich typów referencji:
JLS 4.12.5 Początkowe wartości zmiennych
Jak to jest używane, różni się. Możesz go użyć, aby włączyć tak zwaną leniwą inicjalizację pól, w której pole miałoby swoją wartość początkową do
null
momentu, aż faktycznie zostanie użyte, gdzie zostanie zastąpione wartością „rzeczywistą” (której obliczenie może być kosztowne).Istnieją również inne zastosowania. Weźmy prawdziwy przykład z
java.lang.System
:Jest to bardzo powszechny wzorzec użycia:
null
służy do oznaczenia nieistnienia obiektu.Oto inny przykład użycia, tym razem z
java.io.BufferedReader
:Tak więc tutaj
readLine()
wróciłbyminstanceof String
dla każdej linii, aż w końcu zwraca a,null
oznaczające koniec. Umożliwia to przetwarzanie każdej linii w następujący sposób:Interfejs API można zaprojektować tak, aby warunek zakończenia nie zależał od
readLine()
zwrotunull
, ale widać, że ten projekt ma tę zaletę, że zwięzłość. Zauważ, że nie ma problemu z pustymi liniami, ponieważ pusta linia"" != null
.Weźmy inny przykład, tym razem z
java.util.Map<K,V>
:Tutaj zaczynamy widzieć, jak używanie
null
może komplikować rzeczy. Pierwsze stwierdzenie mówi, że jeśli klucz nie jest zmapowany,null
jest zwracany. Drugie stwierdzenie mówi, że nawet jeśli klucz jest zmapowany,null
można go również zwrócić.W przeciwieństwie do tego,
java.util.Hashtable
upraszcza rzeczy, nie dopuszczającnull
kluczy i wartości; jegoV get(Object key)
, jeśli zwracanull
, jednoznacznie oznacza, że klucz nie jest mapowany.Możesz przeczytać resztę interfejsów API i dowiedzieć się, gdzie i jak
null
jest używany. Pamiętaj, że nie zawsze są to przykłady najlepszych praktyk .Ogólnie rzecz biorąc,
null
są używane jako specjalna wartość oznaczająca:W Javie? Żaden z twoich problemów. I najlepiej tak zachować.
Czy
null
to dobrze?To jest teraz subiektywne. Niektórzy twierdzą, że
null
powoduje to wiele błędów programisty, których można było uniknąć. Niektórzy twierdzą, że w języku, który łapieNullPointerException
jak Java, dobrze jest go używać, ponieważ szybko zawiedziesz przy błędach programisty. Niektóre osoby unikająnull
, używając wzorca obiektu zerowego itp.Sam w sobie jest to ogromny temat, dlatego najlepiej omówić go jako odpowiedź na inne pytanie.
Kończę ten z cytatem z wynalazca
null
siebie CAR Hoare (od Quicksort sławy):Wideo z tej prezentacji sięga głębiej; to zalecany zegarek.
źródło
NIL
) w 1960 r. I prawdopodobnie wcześniej. Ale nie sądzę, żeby Hoare naprawdę starał się wymyślić wynalazek o zerowych referencjach w tym cytacie.Nie. Dlatego
null instanceof X
wrócifalse
do wszystkich klasX
. (Nie daj się zwieść faktowi, że można przypisaćnull
do zmiennej, której typ jest typem obiektu. Ściśle mówiąc, przypisanie obejmuje niejawną konwersję typu; patrz poniżej.)Jest to jedyny element typu null, w którym typ null jest zdefiniowany w następujący sposób:
„Istnieje również specjalny typ zerowy, typ wyrażenia null, który nie ma nazwy. Ponieważ typ null nie ma nazwy, nie można zadeklarować zmiennej typu null ani rzutować na typ null. Null referencja jest jedyną możliwą wartością wyrażenia typu null. Referencja null może być zawsze rzutowana na dowolny typ referencji. W praktyce programista może zignorować typ null i udawać, że null jest jedynie specjalnym dosłownym, który może być dowolnego typ odniesienia ”. JLS 4.1
Patrz wyżej. W niektórych kontekstach
null
jest używany do oznaczenia „brak obiektu” lub „nieznany” lub „niedostępny”, ale te znaczenia są specyficzne dla aplikacji.Jest to specyficzne dla implementacji i nie będzie można zobaczyć reprezentacji
null
w czystym programie Java. (Alenull
jest reprezentowany jako zerowy adres / wskaźnik komputera w większości, jeśli nie we wszystkich implementacjach Java).źródło
Co to jest null?
To nic nie znaczy.
Czy null jest czymkolwiek?
Nie, ponieważ jest niczym. To nie może być żadna instancja.
Do jakiego zestawu należy null?
Żadnego zestawu
Jak jest reprezentowany w pamięci?
Jeśli niektóre odniesienia wskazują na to:
W pamięci sterty część miejsca przypisana do nowo utworzonego obiektu. I o wskaże na to przydzielone miejsce w pamięci.
Teraz
o=null;
Oznacza to, że teraz o nie będzie wskazywać na tę przestrzeń pamięci obiektu.
źródło
Nie, to nie jest żadna instancja, instanceof zawsze będzie fałszywy.
źródło
Słowo kluczowe null jest literałem reprezentującym odwołanie null, które nie odwołuje się do żadnego obiektu . null jest domyślną wartością zmiennych typu referencyjnego.
Może także rzucić okiem
null: Glosariusz Java
źródło
Null nie jest instancją żadnej klasy.
Można jednak przypisać null do zmiennych dowolnego typu (obiekt lub tablica):
źródło
Null in Java (tm)
W C i C ++ „NULL” jest stałą zdefiniowaną w pliku nagłówkowym o wartości takiej jak:
lub:
lub:
w zależności od kompilatora i opcji modelu pamięci. NULL, ściśle mówiąc, nie jest częścią samego C / C ++.
W Javie (tm) „null” nie jest słowem kluczowym, lecz specjalnym literałem typu null. Może być rzutowany na dowolny typ odwołania, ale nie na dowolny typ pierwotny, taki jak int lub boolean. Literał zerowy niekoniecznie ma wartość zero. Nie można rzutować na typ zerowy ani zadeklarować zmiennej tego typu.
źródło
Reprezentacja kodu bajtowego
Java
null
ma bezpośrednią obsługę JVM: do jego implementacji wykorzystywane są trzy instrukcje:aconst_null
: np. aby ustawić zmienną nanull
jak wObject o = null;
ifnull
orazifnonnull
: np. w celu porównania obiektunull
jak wif (o == null)
Rozdział 6 „Zestaw instrukcji wirtualnej maszyny Java” następnie wspomina o wpływie
null
innych instrukcji: rzucaNullPointerException
dla wielu z nich.2.4 „Typy referencyjne i wartości” również wspominają
null
ogólnie:źródło
null
ma szczególną wartość, nie jest to przypadek niczego. Z oczywistych względów nie może to byćinstanceof
nic.źródło
null
to specjalna wartość, która nie jest instancją żadnej klasy. Ilustruje to następujący program:źródło
null
nie jest to instancjaString
.void f(String o)
, miałoby to większy sens.null w Javie jest podobny / podobny do nullptr w C ++.
Program w C ++:
Ten sam program w Javie:
Czy rozumiesz teraz na podstawie kodów powyżej, co jest puste w Javie? Jeśli nie, to polecam nauczyć się wskaźników w C / C ++, a wtedy zrozumiesz.
Zauważ, że w C, w przeciwieństwie do C ++, nullptr jest niezdefiniowany, ale zamiast niego używany jest NULL, który może być również używany w C ++, ale w C ++ nullptr jest bardziej preferowany niż tylko NULL, ponieważ NULL w C jest zawsze powiązany ze wskaźnikami i to jest tak, więc w C ++ przyrostek „ptr” został dołączony na końcu słowa, a także wszystkie litery są teraz małe, ale jest to mniej ważne.
W Javie każda zmienna nietypowej klasy typu jest zawsze odniesieniem do obiektu tego typu lub odziedziczonej, a null jest odwołaniem do obiektu klasy zerowej, ale nie wskaźnikiem zerowym, ponieważ w Javie nie ma czegoś takiego jak „wskaźnik”, ale odniesienia do klasy obiekty są używane zamiast tego, a null w Javie jest powiązany z odwołaniami do obiektów klasy, więc można go również nazwać „nullref” lub „nullrefobj”, ale jest on długi, więc po prostu nazwij go „null”.
W C ++ możesz używać wskaźników i wartości nullptr dla opcjonalnych elementów / zmiennych, tj. Element / zmienna, która nie ma żadnej wartości, a jeśli nie ma żadnej wartości, to jest równa nullptr, więc jak na przykład można użyć wartości null w Javie.
źródło
W Javie istnieją dwie główne kategorie typów: prymitywne i referencyjne . Zmienne zadeklarowane z wartości podstawowych w magazynie typu; zmienne zadeklarowane z odniesieniami do magazynu typu odniesienia.
W takim przypadku instrukcja inicjalizacji deklaruje zmienne „x”. „X” przechowuje odwołanie do ciągu. Tutaj jest zero . Po pierwsze, null nie jest prawidłową instancją obiektu, więc nie ma dla niej przydzielonej pamięci. Jest to po prostu wartość wskazująca, że odwołanie do obiektu nie odnosi się obecnie do obiektu.
źródło
Interesującym sposobem, aby zobaczyć wartość null w java jest, moim zdaniem, postrzeganie jej jako czegoś, co NIE oznacza braku informacji, ale po prostu jako dosłowną wartość, którą można przypisać do odwołania dowolnego typu. Jeśli pomyślisz o tym, jeśli oznaczało to brak informacji, to prawda, że a1 == a2 jest prawdziwa, nie ma sensu (w przypadku, gdy obaj mieli przypisaną wartość null), ponieważ mogliby naprawdę wskazywać na DOWOLNY obiekt (po prostu nie wiem na jakie obiekty powinny wskazywać) ... Nawiasem mówiąc, null == null zwraca true w Javie. Gdyby java np. Byłaby jak SQL: 1999, to null == null zwróciłoby nieznane (wartość logiczna w SQL: 1999 może przyjąć trzy wartości: prawda, fałsz i nieznana, ale w praktyce nieznana jest implementowana jako null w prawdziwych systemach) ... http://en.wikipedia.org/wiki/SQL
źródło
Krótka i precyzyjna odpowiedź, która formalnie odpowiada na wszystkie pytania z JLS:
Przydzielane jest tylko odwołanie typu, które jest przypisane do null. Nie przypisujesz żadnej wartości (obiektu) do odwołania. Taki przydział jest specyficzny dla JVM, ile zajmie odniesienie i w którym obszarze pamięci zostanie przydzielony.
źródło