Object o; 这种写法只是分配一个引用而已。
Object o = null; 这么写则是给引用指向了一个空对象。具体差别如下:
class Test {
public static void main(String[] args) {
Object o1;
o1.toString(); /*这里编译不能通过,编译器只认定o1是个引用,没指向任何对象,所以不能调用方法。*/
Object o2 = null;
o2.toString(); /*这里编译可以过,但是有空指针异常,编译器认定o2是一个对象,虽然是一个空对象。*/
}
}
一个是给一个不存在的人取名字,一个是给死人取名字。你叫不存在的人吃饭这个是谬论,叫死人吃饭则是忽悠。
null对象是一个特殊的对象,他可以是任何类型。他只是作为一个标记而已,只是为了标记不存在而存在的。也没必要去追究他在内存是什么样。null就是一个标记而已。容器可以接受一个空对象,但是一个空引用则是不接受的。
Object o; 是申明了一个叫o的,Object类型的变量
Object o = null; 也是申明了一个叫o的,Object类型的变量,但是同时又将null赋值给了o,也就是初始化了变量o,null是一个代表没有是值,它并不等于空,null是有值的,只是它的值是空的
再从内存上来说,就是Object o;是在栈中占了一块内存,取名叫o
Object o = null;就是Object o;也是在栈中占了一块内存,取名叫o,但是它同时在堆中也占到了一块内存,里面存的是一个null的值,并且栈中的o指向堆中的这块空间
第一个没有申请内存,只是定义了一个变量。
第二个定义了变量,并为该变量申请了一个内存。null就是空的意思,不是指值为0,而是没有的意思。
楼上错了,其实不同的变量的空间是不一样的,如果是int之类的空间就可以不在乎,而自定义内向的空间就有可能很大。
Object o=null这个o在内存中已经分配了空间,而Object o的o在内存中没分配内存空间。
其实两者是应该是一样的,在声明类的成员变量的时候,如果是对象的话默认值就是null