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的参数类型,就好。指哪打哪。


注:以上文章仅是个人学习过程总结,若有不当之处,望不吝赐教。

猜你喜欢

转载自blog.csdn.net/m0_37265215/article/details/82143569
今日推荐