JAVA中对null进⾏强制类型转换(null可以强转为任意对象,并
执⾏对象的静态⽅法)
今天很好奇,对null进⾏强转会不会抛错。做了如下测试得到的结果是,
如果把null强转给对象,是不会抛异常的,本⾝对象是可以为null的。
但是如果是基本类型,⽐如 int i = (Integer)obj的强转,其实内部会调⽤intvalue⽅法去赋值给基本类型,所以这时候是会报错的。
代码如下
Object obj = null;
Integer s1 = (Integer)obj;
上⾯能正常执⾏,即把null赋值给⼀个对象或者强⾏类型转换赋值给对象都是没有问题的。如果s1是 int的基本类型呢?
代码如下,编译时不会报错
int s1 = (Integer)obj;
System.out.println(s1);
执⾏,则报java.lang.NullPointerException错误。
我们反编译后会发现调⽤了 intValue⽅法去获取value,所以抛出空指针错误:
Object obj = null;
int s1 = ((Integer)obj).intValue();
System.out.println(s1);
---------------------
public class NULL {
private static final String TAG = "NULL";
private void abc(){
System.out.println("123");
}
public static void main(String[] args) {
((NULL)null).abc();
}
}
以上代码运⾏时会报错:
Exception in thread "main" java.lang.NullPointerException
st.NULL.main(NULL.java:14)
flect.NativeMethodAccessorImpl.invoke0(Native Method)
flect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
flect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at flect.Method.invoke(Method.java:606)
at cution.application.AppMain.main(AppMain.java:147)
若将⽅法abc加上静态修饰符static
public class NULL {
private static final String TAG = "NULL";
private static void abc(){
System.out.println("123");
}
public static void main(String[] args) {
((NULL)null).abc();
}nullpointerexception: null
}
程序正常运⾏,输出
123
1
null可以被强制类型转换成任意类型的对象,通过这样的⽅式可以执⾏对象的静态⽅法,但如果⽅法不是静态⽅法的话,由于null对象并没有被实例化(分配空间),因⽽运⾏时会报空指针错误。