1. 程式人生 > >null與""的區別

null與""的區別

總結null與"":

null指的是空物件,""指的是字串空。

String s = "";
s.substring(0);

上述對於字串操作是沒有問題的。但是如下程式碼:

String s2 = null;
s2.substring(0);

是會出現問題的,報錯如下:

Exception in thread "main" java.lang.NullPointerException

可見,最本質的區別null指的是空物件,""指的是空字串。

String s=null;//null是未分配堆記憶體空間

String a;//分配了一個記憶體空間,沒存入任何物件

String a="";//分配了一個記憶體空間,存了一個字串物件


需要注意的一點是:null作為引數傳遞的時候,由於存在方法過載,所以null進行匹配方法的時候,會有幾點要注意的地方:

首先常規引數進行匹配過載方法:先按標準的型別進行匹配:比如說:

print(int a);

那麼就匹配方法引數是int型別的print方法。

但是如果沒有匹配到int的話,引數對於方法的匹配就可能會先自動型別轉換,進行匹配。

比如匹配到一個接收double型別引數的print,或者是接收Object型別的print。

那麼null值作為引數的話:他可以作為所有基本型別的包裝型別的引用;

Integer i=null;

Float f=null;

String s=nu;

Object obj=null;等等

那麼這個時候null怎麼匹配呢?

public class book_08 {

	public static void main(String[] args) {
		Test t = new Test();
		t.print(null);

	}
}

class Test {

	void print(String s) {
		System.out.println("String");
	}

	void print(Integer s) {
		System.out.println("Integer");
	}

}

上述程式碼會報錯,再t.print(null)處,他要求你指明是Integer還是String型別。為什麼呢??因為Test類中過載的print函式接受的方法一個是String型別一個是Integer型別,算是同等級的型別,那麼編譯器不會選擇了,不知道選哪個了,所以需要開發者人為指定。

public class book_08 {

	public static void main(String[] args) {
		Test t = new Test();
		t.print(null);

	}
}

class Test {

	void print(String s) {
		System.out.println("String");
	}

	void print(int s) {
		System.out.println("int");
	}

}
//執行結果
String

上面這段程式碼就不出問題,因為int型別的變數無法接收null值,所以編譯器會發現好像只有String能接收,自然走的就是print(String s){...}方法。

public class book_08 {

	public static void main(String[] args) {
		Test t = new Test();
		t.print(null);

	}
}

class Test {

	void print(Object obj) {
		System.out.println("Object");
	}

	void print(String s) {
		System.out.println("String");
	}

}
//執行結果
String

上面這段程式碼的結果為什麼是String呢??(null不是Object型別嗎??不對,null僅僅是null,哪裡需要哪裡null,null了哪裡,null就屬於哪種型別!!)因為編譯器預設的從最精確的引數型別匹配來匹配方法,所以String類型別的範圍比Object型別的精確,先匹配的String型別。通過反編譯的結果也能看到,預設對null進行的String型別轉化。

public class book_08 {

   public static void main(String[] args) {
      Test t = new Test();
      t.print((String)null);
   }
}

上述就是編譯器給我們的null值做的轉換。

當然,最後對null作為引數傳遞的建議是:直接給定null的引數型別,就好。指哪打哪。


注:以上文章僅是個人學習過程總結,若有不當之處,望不吝賜教。