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的引數型別,就好。指哪打哪。
注:以上文章僅是個人學習過程總結,若有不當之處,望不吝賜教。