要理解null在 Java 中的含义,让我们看一个与数字的类比:数字 0 表示缺少某物,而null在引用数据类型时表示相同的事物。如果引用类型(例如StringObjectStringBuilder)的字段未显式分配值,则通过类比原始类型,它会收到一个默认值,该值为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:null
元素 1:null
元素 2:null
元素 3:null
元素 4:null
元素 5:
null 元素 6:null
元素 7:null
元素 8:null
元素 9:null
元素 10:null
元素 11:null

如您所见,当与字符串连接时,值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是一个保留关键字(如publicstatic ),因此您不能创建名为null 的变量、方法或类。与其他关键字一样,此关键字区分大小写(您可能已经注意到我们在所有地方都以小写字母写null)。这意味着:

String firstName = Null; // Compilation error
String secondName = NULL; // Compilation error
String fullName = null; // This will compile

让我们看看您还可以用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

在前面的课程中,我们谈到了 Java 中的一切都是对象,并且每个对象都有一个类型。

在这方面我们可以对null说些什么?null是某种类型的文字,这种类型没有名字。由于此类型没有名称,因此无法声明此类型的变量或对其进行强制转换。因此,null是此未命名类型的唯一代表。在实践中,我们可以忽略这种类型,将null视为一种特殊的文字,可以分配给任何引用变量。

要记住的事情:

  • null是引用数据类型的默认值
  • null表示“没有价值”
  • 如果我们在值为null 的对象上调用任何方法,代码将编译但在运行时我们将得到NullPointerException