Aby zrozumieć, do czego służy wartość null w Javie, weźmy analogię z liczbami: liczba 0 symbolizuje brak czegoś, a wartość null oznacza to samo dla referencyjnych typów danych. Jeśli do pola typu referencyjnego ( String , Object , StringBuilder ) nie zostanie przypisana żadna wiedza , otrzyma ono wartość domyślną, podobną do typów pierwotnych, a ta wartość będzie równa null :
Kod | Wyjście na wyświetlaczu |
---|---|
|
0
zero |
Ale jeśli zadeklarujesz taką tablicę:
String[] strings = new String[12];
zostanie utworzona tablica zawierająca 12 elementów, a wszystkie z nich będą miały wartość null :
Kod | Wyjście na wyświetlaczu |
---|---|
|
0 element: null
1. element: null 2. element: null 3. element: null 4. element: null 5. element: null 6. element : null 7. element: null 8-ty element: null 9. element: null 10. element: null 11. element : zero |
Jak widać, po połączeniu z łańcuchem, wartość null staje się ciągiem „ null ”. Chociaż, jeśli wywołasz jego metodę toString() :
String[] strings = null;
System.out.println(strings.toString());
otrzymasz wyjątek NullPointerException (szczegółowo omówimy wyjątki później). To samo stanie się, jeśli spróbujesz wywołać inną metodę na null (wyjątkiem są metody statyczne, z którymi spotkasz się wkrótce):
public static void main(String[] args) {
StringBuilder sb = null;
sb.append("test"); // This will compile, but there will be a runtime error
}
null jest między innymi zastrzeżonym słowem kluczowym (takim jak public lub static ), więc nie można utworzyć zmiennej, metody ani klasy o nazwie null . W tym słowie kluczowym, podobnie jak w innych, rozróżniana jest wielkość liter (być może zauważyłeś, że wszędzie piszemy null małą literą), więc:
String firstName = Null; // Compilation error
String secondName = NULL; // Compilation error
String fullName = null; // This will compile
Zobaczmy, co jeszcze możesz, a czego nie możesz zrobić z null :
-
Każde odwołanie można ustawić na wartość null :
StringBuilder sb = null;
-
null można rzutować na dowolny typ referencyjny:
String s = (String) null; // This will compile, but doing this doesn't make any sense :)
-
null nie można przypisać do zmiennej pierwotnej:
int i = null; // This won't compile
-
null można porównać z == i !=
-
null == null zwraca wartość true
Na poprzednich wykładach mówiliśmy o tym, że wszystko w Javie jest obiektem, a każdy obiekt ma swój typ.
Co możemy powiedzieć o null w tym zakresie ? null jest literałem pewnego typu, a ten typ nie ma nazwy. A ponieważ ten typ nie ma nazwy, nie można zadeklarować zmiennej tego typu ani rzucić na nią rzutu. Zatem null jest jedynym przedstawicielem tego nienazwanego typu. W praktyce możemy zignorować ten typ i reprezentować null jako specjalny literał, który można przypisać do zmiennej dowolnego typu referencyjnego.
O czym należy pamiętać:
- null jest wartością domyślną dla referencyjnych typów danych;
- null oznacza „brak wartości”;
- jeśli jakakolwiek metoda zostanie wywołana na obiekcie, którego wartość jest null , kompilacja takiego kodu zakończy się niepowodzeniem, aw czasie wykonywania otrzymamy wyjątek NullPointerException .