创建对象:C++和Java的异同
C++ | Java |
类定义: Class User {...}; | 类定义: Class User {...} |
对象构造: (1) User u(...); 对象构造: (2) User* p = new User(...);
| 对象构造: User q = new User(...); |
在标号为(1)的构造函数调用中,我们可以把u本身当作一个User对象。这个构造函数调用填充由u对象所占据的内存区域(栈空间),如下图(a)部分所示。
标号为(2)的构造函数调用创建了一小块内存区域(栈空间),其中存储了p的值(一个内存地址),然后填充一个较大的内存区域(堆空间),赋值符右边所创建的User对象就存储在这块内存中。p所指向的内存地址就是User对象存储位置。如下图(b)部分所示
Java的构造函数调用也保留一个内存位置(栈空间)存储q的值,并填充一块内存(堆空间)保存User对象。在这种情况下,为q的值所保留的内存地址保存了User对象引用,如下图(C)部分所示。
JAVA创建对象和C# 创建对象一样
我们可以把q中存储的对象引用看成是一个伪指针(一个内存伪地址),之所以说它是伪指针,是因为我们不能像C++指针那样对它进行解引用。如果由于内存管理的需要,JVM决定把这个User对象移动到内存中的一个不同位置,q所保存的对象引用仍然能够找到这个对象。反之,如果p所指向的对象转移到内存中的不同位置,那么p的值需要在程序的控制下进行显示的修改