User user = um.showUserById(JSONObject.getNames(uid)[0]);
比如这句话,来源于sina微博API。
我觉得左边user仅仅是一个引用,就像c/c++里int *a一样,仅仅是个(指针)指向,没有实例化一个4字节的int型变量。
但是有人说这在java里叫做声明+实例化,就是说这句话等于先,User user = new User(),再user = um.showUserById(JSONObject.getNames(uid)[0]);。
但我觉得这样的话,内存里会存在2个相同的对象,原对象等号右边的对象,新对象,user对象复制了一份 等号右边的对象。
那么执行了这句话后,内存究竟有几个对象?
如果 最上面的一句话 仅在内存在申请了一个对象的话岂不是节省内存?
没有搞过C语言,但是在Java里实例化是指内存创建了一个类型的实例(给它开一个内存空间),这个过程被叫做实例化,也就是说内存创建了这个类的实例,那就是被实例化了,没有创建就没有被实例化
1. 所以按照这个逻辑来讲,若你这个user == null,那也就是说这个对象没有被实例化
2. 而user其实只是一个引用,也可以叫指针吧,他指向了一个内存中真实的User实例,但是若um.showUserById(JSONObject.getNames(uid)[0])返回的是一个null,那这个user指针只是一个空指针而已,你可以把这个表达式分开写
第一行可以叫创建了一个User类实例的指针,名字叫user
第二行创建了一个User的实例,但是由于实例没有被任何一个已经申明的指针引用到,所以第二行代码执行后,虽然在内存中已经创建了一个User的实例,但是由于没有被任何指针引用到,所以这个新建的实例没有用,最后被在这个代码块结束后被GC回收掉内存
这样分开写后,应该可以看到其实User user =um.showUserById(JSONObject.getNames(uid)[0]); 内存只会生成一个实例,而这个实例有指针user指向它而已