📜  关于Java中null的有趣事实

📅  最后修改于: 2020-03-18 12:27:15             🧑  作者: Mango

几乎所有的编程语言都会有null的绑,几乎没有程序员会为空所困扰。在Java中,null与java.lang.NullPointerException相关联。因为它是java.lang包中的类,所以当我们尝试执行一些带有或不带有null的操作时有时会调用它,有时我们甚至不知道它的源头位置。

以下是每个Java程序员都应了解的有关Java中null的一些重要要点:
1. null是区分大小写的: null在Java中是文字,并且由于关键字在Java中是区分大小写的,因此我们不能像在C语言中那样编写NULL或0。

public class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // 编译错误: can't find symbol 'NULL'
        Object obj = NULL;
        //成功编译
        Object obj1 = null;
    }
}

输出:

5: error: cannot find symbol
 can't find symbol 'NULL'
                 ^
   variable NULL
 class Test
1 error

2.参考变量值: Java中的任何参考变量的默认值均为null。

public class Test
{
    private static Object obj;
    public static void main(String args[])
    {
        // 打印 null;
        System.out.println("obj的值是 : " + obj);
    }
}

输出:

obj的值是 : null

3. null的类型:与常见的数据类型不同,null不是Object对象也不是类型。这只是一个特殊值,可以将其分配给任何引用类型,并且可以将cast null键入任何类型。
示例:

    // null可以被赋值给String
    String str = null;
    // null可以被赋值给Integer
    Integer itr = null;
    // null可以被赋值给Double
    Double dbl = null;
    // null可以被转换成String
    String myStr = (String) null;
    // null可以被转换成Integer
    Integer myItr = (Integer) null;
    // null可以被转换成Double
    Double myDbl = (Double) null;

4.自动装箱和拆箱:自动装箱和拆箱操作期间,如果将空值null分配给原始装箱的数据类型,则编译器仅引发Nullpointer异常错误。

public class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
            // 一个integer可以为null
            Integer i = null;
            // 把null拆箱给integer,会报错NullpointerException
            int a = i;
    }
}

输出:

 Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.Java:6)

5. instanceof运算符: Java instanceof运算符用于测试对象是否是指定类型(类,子类或接口)的实例。在运行时,如果Expression的值不为null,则instanceof运算符的结果为true。

这是instanceof操作的重要属性,使其对于类型转换检查很有用。

public class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Integer i = null;
        Integer j = 10;
        //打印false
        System.out.println(i instanceof Integer);
        //成功编译
        System.out.println(j instanceof Integer);
    }
}

输出:

false
true

6.静态方法与非静态方法:我们不能对具有空值null的引用变量调用非静态方法,它将抛出NullPointerException,但可以对具有空值null的引用变量调用静态方法。由于静态方法是使用静态绑定的,因此它们不会引发Null指针异常。

public class Test
{
    public static void main(String args[])
    {
        Test obj= null;
        obj.staticMethod();
        obj.nonStaticMethod();
    }
    private static void staticMethod()
    {
        //可以被null引用调用
        System.out.println("静态方法, 可以对null引用调用");
    }
    private void nonStaticMethod()
    {
        //无法被null引用调用
        System.out.print("非静态方法");
        System.out.println("无法对null的引用调用");
    }
}

输出:

static method, can be called by null referenceException in thread "main"
java.lang.NullPointerException
    at Test.main(Test.Java:5)

7. ==和!=,在Java中,允许对null进行比较且使用不等于运算符,但可以使用null。这对于用Java中的对象检查null很有用。

public class Test
{
    public static void main(String args[])
    {
    //返回 true;
    System.out.println(null==null);
    //返回 false;
    System.out.println(null!=null);
    }
}

输出:

true
false