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

public class Solution {

    public static int i;
    public static String s;

    public static void main(String[] args) {
        System.out.println(i);
        System.out.println(s);
    }
}
                    
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

public class Solution {
    public static void main(String[] args) {
        String[] strings = new String[12];

        for (int i = 0; i < strings.length; i++) {
            System.out.println("Element " + i + ":" + strings[i]);
        }
    }
}
                    
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 .