一脸懵的 null
写在开局
偶尔的一次刷题过程中看见一个关于Java语言的null问题,才有关于本篇笔记的思考记录,欢迎大家一起交流…
刷题举例
话不多说, 直接上代码
public class NULL{
public static void xixi(){
System.out.print("1");
}
//静态方法通过类.方法可以调用
public static void main(String[] args){
((NULL)null).xixi();//结果输出是1
}
}
public class NULL{
public static void xixi(){
System.out.print("1");
}
public static void main(String[] args){
((String)null).length();//结果报空指针异常
}
}
关键点: null 可以被强转成任何类型
1. null是Java中的关键字,大小写敏感
和其它的五十几个关键字,保留字一样,它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别他们然后报错;
2. null是任何引用类型的默认值
不严格的说是所有object类型的默认值。
就像每种原始类型都有默认值一样,如int默认值为0,boolean的默认值为false;
3. null是特殊的值,null 可以被强转成任何类型
①null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型;
②你也可以将null转化成任何类型.
在编译和运行时期,将null强制转换成任何引用类型都是可行的,在运行时期都不会抛出空指针异常。如上述代码举例.
4. null可以赋值给引用变量,你不能将null赋给基本类型变量,例如int、double、float、boolean。
5. 任何含有null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。一些程序员犯这样的错误,他们认为自动装箱会将null转换成各自基本类型的默认值,例如对于int转换成0,布尔类型转换成false,但是那是不正确的。
6. 如果使用了带有null值的引用类型变量,instanceof操作将会返回false:
7. 你可以使用或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。跟SQL不一样,在Java中nullnull将返回true。
8. null和“”并不相等,因为下面的s并没有指向某一块内存,而s1指向了一块空字符串的内存.
- 你可能知道不能调用非静态方法来使用一个值为null的引用类型变量。它将会抛出空指针异常,但是你可能不知道,你可以使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态绑定,不会抛出空指针异常。
总而言之,记住,null是任何一个引用类型变量的默认值,在java中你不能使用null引用来调用任何的instance方法或者instance变量。
null 在 Java 中是一个特殊的存在,因为它和大名鼎鼎的 NullPointerException(NPE)如影随形。NPE 的发明人 Tony Hoare 曾在 2009 年承认:“Null References 是一个荒唐的设计,就好像我赌输掉了十亿美元”。
写在最后:
如果一个变量当前没有确定要初始化的值,那么 null 就是最佳选择,即所谓的延迟初始化,直到实际使用的时候再赋值为“它实际”的值;
更神奇的是,null 竟然可以被强制转化;