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