📜  Java中关于 null 的有趣事实

📅  最后修改于: 2022-05-13 01:55:13.212000             🧑  作者: Mango

Java中关于 null 的有趣事实

几乎所有的编程语言都与 null 绑定。几乎没有一个程序员不为 null 所困扰。
在Java中,null 与Java.lang.NullPointerException 相关联。由于它是Java.lang 包中的一个类,当我们尝试执行一些带或不带 null 的操作时会调用它,有时我们甚至不知道它发生在哪里。

下面是关于Java中 null 的一些要点,每个Java程序员都应该知道:

1. null 区分大小写: null 在Java中是字面量量,因为关键字在Java中区分大小写,所以我们不能像 C 语言那样写 NULL 或 0。

public class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // compile-time error : can't find symbol 'NULL'
        Object obj = NULL; 
          
        //runs successfully
        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[])
    {
        // it will print null;
        System.out.println("Value of object obj is : " + obj);
    } 
}

输出:

Value of object obj is : null 

3. null 的类型:与常见的误解不同,null 不是 Object,也不是类型。它只是一个特殊值,可以分配给任何引用类型,您可以将强制类型转换为任何类型
例子:

// null can be assigned to String
    String str = null; 
    
    // you can assign null to Integer also
    Integer itr = null; 
    
    // null can also be assigned to Double
    Double dbl = null; 
        
    // null can be type cast to String
    String myStr = (String) null; 
    
    // it can also be type casted to Integer
    Integer myItr = (Integer) null; 
    
    // yes it's possible, no error
    Double myDbl = (Double) null; 

4. 自动装箱和拆箱:在自动装箱和拆箱操作期间,如果将空值分配给原始装箱数据类型,编译器会简单地抛出 Nullpointer 异常错误。

public class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
            //An integer can be null, so this is fine
            Integer i = null;
              
            //Unboxing null to integer throws 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;
              
        //prints false
        System.out.println(i instanceof Integer);
          
        //Compiles successfully
        System.out.println(j instanceof Integer);
    }
}

输出:

false 
true

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

public class Test
{             
    public static void main(String args[])
    {
        Test obj= null;
        obj.staticMethod();
        obj.nonStaticMethod();                             
    }
      
    private static void staticMethod()
    {
        //Can be called by null reference
        System.out.println("static method, can be called by null reference");
          
    }
          
    private void nonStaticMethod()
    {
        //Can not be called by null reference
        System.out.print(" Non-static method- ");
        System.out.println("cannot be called by null reference");
          
    }
  
}

输出:

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

7. == 和 !=比较和不等于运算符在Java中允许使用 null。这在使用Java中的对象检查 null 时很有用。

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

输出:

true
false