Integer a=null;
简单问下为什么
String.valueOf(a);//不报错
a.toString();//会报错
1.既然a在上面能看成Integer,为什么这里不能看成Integer
是因为null不是Object的子类,不能调用.toString()方法吗,还是别的什么原因,望指教
2.还有发现如果赋予某引用类型空值的话,它就不是Object实例了。
例如上面的a instanceof Object返回false,虽然我知道null不是任何引用类型的实例,但不能将a看成Integer类型吗
如果不能的话,那么为什么String.valueOf(a)又正确了呢,有点奇怪
简单问下为什么
String.valueOf(a);//不报错
a.toString();//会报错
1.既然a在上面能看成Integer,为什么这里不能看成Integer
是因为null不是Object的子类,不能调用.toString()方法吗,还是别的什么原因,望指教
2.还有发现如果赋予某引用类型空值的话,它就不是Object实例了。
例如上面的a instanceof Object返回false,虽然我知道null不是任何引用类型的实例,但不能将a看成Integer类型吗
如果不能的话,那么为什么String.valueOf(a)又正确了呢,有点奇怪
这就是为什么a.toString()会报空指针
String.valueOf(a)不会报错 但是返回的也是null
我个人感觉在a==null的话就不算Integer
听听别人的看法
而在一个引用变量上调用实例方法(或访问其实例变量),则首先需要该变量指向一个对象实例,因为无论是调用成员方法还是访问成员变量,Java都必须知道某个具体实例的内存地址,null不代表任何实例,当然不可接受的。但是,指向null的变量,仍然可以调用其静态方法(或访问其静态变量),因为这时Java不需要一个具体的实例,只需要有类对象存在即可。如:
Integer a = null;
a.toString(100); // 这里的toString()是Integer类的静态方法
Integer a = null;
首先你声明了一个Integer引用,此时你并没有将a指向Integer对象,而是将null赋给a ;
null在内存中有个特殊的空间,而这个特殊的空间是空的. 所以a无法调用任何方法,
而String.valueOf(a); valueOf是String类里的静态方法,你可以传一个空的Integer引用
作为参数,因为valueOf方法里有判断传过来的参数是否是null的,然后对null的参数处理。如果你是Integer a = new Integer(0);
那么首先你堆里面创建了一个对象后(中间细节略),返回该对象的地址给Integer引用a.
当你调用a.toString(),首先通过a找到a所指向的对象,然后再通过该对象到代码区找到是否
有toString这个方法没,没有则报错。
而a.toString()是对对象的方法进行调用,a都没有实例,当然报空指针错误。
默认情况下,返回的字符串有该对象所属的类名,“@”和代表该对象的无符号16进制数(一般是对象所在的内存地址组成)一般情况下,Object类中的toString()方法默认返回的字符串没有什么实用价值,其子类需要覆盖这个方法,使它返回一个代表该对象易懂的串。每个包装类中带有toString(value)方法
System.out.println(Integer.toString(200));
1.首先传递参数是个赋值的过程,也就是说如果对任何引用变量传递为null的对象的话,都是可以接受的,也就是编译的时候不会出错,但运行时出不出错就要具体情况具体分析了,如果出错那肯定是传空指针异常。
例如同样是static方法,同样是传递参数,但是static String copyValueOf(char[] data)
会报错。至于为什么会报错就要看源代码了。
2.还有就是在如果要调用一个类的成员方法或变量,那你必须要有他的实例,因为java要知道某个实例的具体内存地址,除非是调用静态方法或变量。虽然某类型变量的实例的指向null,但他还是能够代表该类的,所以肯定能调用静态方法。
而String.valueOf(a);是将a作为valueOf方法的参数,你可以查看jdk的src,应该是对null进行处理了。直接返回的是字符串"null"