java 静态类设置null_JAVA中对null进行强制类型转换(null可以强转为任意对象,并执行对象的静态方法)...
今天很好奇,對(duì)null進(jìn)行強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋錯(cuò)。做了如下測(cè)試得到的結(jié)果是,
如果把null強(qiáng)轉(zhuǎn)給對(duì)象,是不會(huì)拋異常的,本身對(duì)象是可以為null的。
但是如果是基本類型,比如 int i = (Integer)obj的強(qiáng)轉(zhuǎn),其實(shí)內(nèi)部會(huì)調(diào)用intvalue方法去賦值給基本類型,所以這時(shí)候是會(huì)報(bào)錯(cuò)的。
代碼如下
Object obj = null;
Integer s1 = (Integer)obj;
上面能正常執(zhí)行,即把null賦值給一個(gè)對(duì)象或者強(qiáng)行類型轉(zhuǎn)換賦值給對(duì)象都是沒有問題的。如果s1是 int的基本類型呢?
代碼如下,編譯時(shí)不會(huì)報(bào)錯(cuò)
int s1 = (Integer)obj;
System.out.println(s1);
執(zhí)行,則報(bào)java.lang.NullPointerException錯(cuò)誤。
我們反編譯后會(huì)發(fā)現(xiàn)調(diào)用了 intValue方法去獲取value,所以拋出空指針錯(cuò)誤:
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();
}
}
以上代碼運(yùn)行時(shí)會(huì)報(bào)錯(cuò):
Exception in thread "main" java.lang.NullPointerException
at com.test.NULL.main(NULL.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
若將方法abc加上靜態(tài)修飾符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();
}
}
程序正常運(yùn)行,輸出
123
1
null可以被強(qiáng)制類型轉(zhuǎn)換成任意類型的對(duì)象,通過這樣的方式可以執(zhí)行對(duì)象的靜態(tài)方法,但如果方法不是靜態(tài)方法的話,由于null對(duì)象并沒有被實(shí)例化(分配空間),因而運(yùn)行時(shí)會(huì)報(bào)空指針錯(cuò)誤。
總結(jié)
以上是生活随笔為你收集整理的java 静态类设置null_JAVA中对null进行强制类型转换(null可以强转为任意对象,并执行对象的静态方法)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java字段不序列化注解_@Transi
- 下一篇: 印钞机 java c c vb_自己动