既然提问者了解C、C++,这个问题似乎就能说清楚。至于是“传值”还是“传引用“的问题,我想是难以说清楚的:因为我也不清楚字典中如何定义”值“、”引用“、”指针“。
首先,User user; 是一个申明。这个和C/C++一样,在当前方法的栈区保留了一个 4字节(32位JVM)或8字节(64位JVM,以下以64位位例说明)的内存区来存放一个对象指针。对象是在 Heap中分配的。这8个字节的内存,有自己的地址,这个地址的别名就叫 "user",8个字节中的long 值,就是 User 对象的地址。 申明语句并不分配对象,因此,并不等于 User user = new User(); Java的 User user 申明相当于 C++中的User * user 而不是 User user。(C++可以在栈区分配对象,Java不可以)。
理解了这个差别,你就应该知道,既然不存在栈上分配对象,这个语句也就不存在拷贝构造了。这句话其实等效于 C++ 的:
User * user = um.showUserById(JSONObject.getNames(uid)[0]);如果 最上面的一句话 仅在内存在申请了一个对象的话岂不是节省内存?
所以,这句话实际上并没有申请任何对象。因为申请对象的操作其实是在 showUserById 方法中进行的,这个语句仅仅是将其的返回对象地址赋值给 user 这个变量而已。
BTW 看到很多回答很严肃的批评了提问者的逻辑混乱。我觉得应该鼓励这个提问者的”追根究底“的态度的。你可能是带有C++的经验,对Java还不够熟悉,这个很正常,不懂装懂,或者不懂还不知道自己不懂,才是最可怕的。而且这些问题是C++转向Java的自然问题,很多不了解C++的Java程序员自己也不懂这些内存级别上的概念,甚至问不出这样的问题来。