За да разберем Howво означава null в Java, нека разгледаме една аналогия с числата: числото 0 символизира липсата на нещо, а null означава същото нещо, когато става дума за референтни типове данни. Ако поле от референтен тип (като String , Object or StringBuilder ) не е изрично присвоена стойност, тогава, по аналогия с примитивните типове, то получава стойност по подразбиране и тази стойност е null :

Код Конзолен изход

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
нула

Но ако декларирате масив по този начин:


String[] strings = new String[12];

ще бъде създаден масив, съдържащ 12 елемента и всички те ще бъдат null :

Код Конзолен изход

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: нула
Елемент 1: нула
Елемент 2: нула
Елемент 3: нула
Елемент 4: нула
Елемент 5: нула
Елемент 6: нула
Елемент 7: нула
Елемент 8: нула
Елемент 9: нула
Елемент 10: нула
Елемент 11: нула

Както можете да видите, когато се свърже с низ, стойността null става низът " null ". Въпреки това, ако извикате метода toString() върху него, като това:


String[] strings = null;
System.out.println(strings.toString());

тогава ще получите NullPointerException ( ще обсъдим изключенията подробно по-късно). Същото се случва, ако се опитате да извикате друг метод на null (изключение са статичните методи, с които ще се запознаете скоро):


public static void main(String[] args) {
    StringBuilder sb = null;
    sb.append("test"); // This will compile, but there will be a runtime error
}

null е, наред с други неща, запазена ключова дума (като public or static ), така че не можете да създадете променлива, метод or клас с име null . Подобно на другите, тази ключова дума е чувствителна към малки букви (може да сте забелязали, че навсякъде пишем null с малки букви). Това означава:


String firstName = Null; // Compilation error

String secondName = NULL; // Compilation error

String fullName = null; // This will compile

Нека да видим Howво още можете и Howво не можете да правите с null :

  • Можете да присвоите null на всяка препратка:

    
    StringBuilder sb = null;
                
  • null може да бъде прехвърлен към всеки референтен тип:

    
    String s = (String) null; // This will compile, but doing this doesn't make any sense :)
                
  • null не може да бъде присвоен на примитивна променлива:

    
    int i = null; // This won't compile
                
  • null може да се сравни с == и !=

  • null == null връща true

В предишни уроци говорихме за това How всичко в Java е обект и всеки обект има тип.

Какво можем да кажем за null в това отношение? null е литерал от определен тип и този тип няма име. И тъй като този тип няма име, е невъзможно да се декларира променлива от този тип or да се преобразува към нея. По този начин null е единственият представител на този неназован тип. На практика можем да игнорираме този тип и да мислим за null като за специален литерал, който може да бъде присвоен на всяка референтна променлива.

Неща, които трябва да запомните:

  • null е стойността по подразбиране за референтни типове данни
  • null означава "няма стойност"
  • Ако извикаме който и да е метод на обект, чиято стойност е null , codeът ще се компorра, но по време на изпълнение ще получим NullPointerException .