搜尋
首頁JavaJava入門java中的null是物件麼

java中的null是物件麼

Dec 06, 2019 pm 02:34 PM
javanull物件

java中的null是物件麼

java中的null既不是物件也不是一種類型,它僅是一種特殊的值,你可以將其賦予任何引用類型,你也可以將null轉化成任何類型。

null關鍵字詳解

1、首先,null是關鍵字,像public、static、final。它是大小寫敏感的,你不能將null寫成Null或NULL,編譯器將不能識別它們然後報錯。

2、就像每種基本型別都有預設值一樣,如int預設值為0,boolean的預設值為false,null是任何參考型別的預設值。就像你創建了一個布林類型的變量,它將false作為自己的預設值,Java中的任何引用變數都將null作為預設值。這對所有變數都是適用的。

如成員變數、局部變數、實例變數、靜態變數(但當你使用一個沒有初始化的局部變量,編譯器會警告你)。為了證明這個事實,你可以透過創建一個變數然後列印它的值來觀察這個引用變數。

免費影片教學推薦:java影片

3、我們要澄清一些誤解,null既不是物件也不是一種類型,它僅是一種特殊的值,你可以將其賦予任何引用類型,你也可以將null轉換成任何類型,來看下面的程式碼:

String str = null;
Integer i = null;
Double d = null; 

String myStr = (String) null;
Integer myI = (Integer) null;
Double myD = (Double) null;

你可以看到在編譯和運行時期,將null強制轉換成任何引用類型都是可行的,在運行期間都不會拋出空指標異常。

4、null可以賦值給引用變量,你不能將null賦給基本型別變量,例如int、double、float、boolean。編譯器將會報錯。

正如你所看到的那樣,當你直接將null賦值給基本類型,會出現編譯錯誤。但如果將null賦值給包裝類別object,然後將object賦給各自的基本類型,編譯器不會報,但是你將會在運行時期遇到空指標異常。這是Java中的自動拆箱導致的。

5、任何含有null值的包裝類別在Java拆箱產生基本資料型別時候都會拋出一個空指標例外。一些程式設計師犯這樣的錯誤,他們認為自動裝箱會將null轉換成各自基本類型的預設值,例如對於int轉換成0,布林類型轉換成false,但是那是不正確的,如下面所示:

Integer iAmNull = null;
int i = iAmNull; // Remember - No Compilation Error

但是當你執行上面的程式碼片段的時候,你會在控制台上看到主執行緒拋出空指標例外。在使用HashMap和Integer鍵值的時候會發生很多這樣的錯誤。當你運行下面程式碼的時候就會出現錯誤。

public class Test3 {
  public static void main(String args[]) throws InterruptedException {
    Map numberAndCount = new HashMap<>();
    int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};
    for(int i : numbers){      
  int count = (int) numberAndCount.get(i);//NullPointerException
      numberAndCount.put(i, count++); 
    } 
  }
}
package test;import java.util.HashMap;
import java.util.Map;
public class Test3 {
  public static void main(String args[]) throws InterruptedException {    
      Map numberAndCount = new HashMap<>();    
      Integer[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};    
      for(Integer i : numbers){      
          Integer count = (Integer) numberAndCount.get(i);      
          numberAndCount.put(i, count++); // NullPointerException    
      }    
  }
}

這段程式碼看起來非常簡單且沒有錯誤。你所做的一切是找到一個數字在數組中出現了多少次,這是Java數組中典型的尋找重複的技術。開發者先得到以前的數值,然後再加一,最後把值放回Map裡。

程式設計師可能會以為,當呼叫put方法時,第一種方式是轉換int報空指針,驗證之前說的。第二種方式,自動裝箱會自己處理好拆裝箱問題,但是忘記了當一個數字沒有計數值的時候,get方法回傳null,而不是0,因為Integer的預設值是null而不是0。當null值傳遞給int型變數的時候自動裝箱將會傳回空指標異常。

6、如果使用了帶有null值的參考類型變量,instanceof操作將會傳回false

Integer iAmNull = null;
if(iAmNull instanceof Integer){
   System.out.println("iAmNull is instance of Integer");                            
 }else{
   System.out.println("iAmNull is NOT an instance of Integer");
}

這是instanceof操作一個很重要的特性,使得對型別強制轉換檢查很有用。

7、你可能知道不能呼叫非靜態方法來使用一個值為null的參考類型變數。它將會拋出空指標異常,但是你可能不知道,你可以使用靜態方法來使用一個值為null的引用類型變數。因為靜態方法使用靜態綁定,不會拋出空指標異常。以下是一個例子:

public class Testing {            
   public static void main(String args[]){
      Testing myObject = null;
      myObject.iAmStaticMethod();
      myObject.iAmNonStaticMethod();                            
   }
  
   private static void iAmStaticMethod(){
        System.out.println("I am static method, can be called by null reference");
   }
  
   private void iAmNonStaticMethod(){
       System.out.println("I am NON static method, don&#39;t date to call me by null");
   }

8、你可以將null傳遞給方法使用,這時方法可以接收任何引用類型,例如public void print(Object obj)可以這樣呼叫print (null)。從編譯角度來看這是可以的,但結果完全取決於方法。 null安全的方法,如在這個例子中的print方法,不會拋出空指標異常,只是優雅的退出。

如果業務邏輯允許的話,推薦使用null安全的方法。

9、你可以使用==或!=操作來比較null值,但不能使用其他演算法或邏輯運算,例如小於或大於。在Java中null==null將傳回true。

相關文章教學推薦:java入門

#

以上是java中的null是物件麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),