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
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加上靜態修飾符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();
}
}

程序正常運行,輸出

123
1
null可以被強制類型轉換成任意類型的對象,通過這樣的方式可以執行對象的靜態方法,但如果方法不是靜態方法的話,由於null對象並沒有被實例化(分配空間),因而運行時會報空指針錯誤。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM