Java中对象的对象引用及内存图分配

一.基本概念

1.对象:new()运算符在java虚拟机(JVM)的堆内存中开辟的内存空间称为对象。
2.对象引用:对象引用,是一个变量,这个变量中保存了另一个java对象的内存地址,对象引用储存在栈内存中。
3.new运算符:new运算符的作用是创建对象,在JVM中开辟新的内存空间。
4.JVM的存储机制
Java中对象的对象引用及内存图分配_第1张图片

二.实例分析

下面给出一个代码实例及解析

Java中对象的对象引用及内存图分配_第2张图片
示例代码在JVM中的存储机制
Java中对象的对象引用及内存图分配_第3张图片

三.java对象的创建与c++对象创建的区别

1.首先看c++中创建对象的方式:
1.Student s; //定义标识符s,没有实际空间
2.Student s = new Student(); //定义s,并绑定到新创建的对象
第一种方式:s被存储在栈内存中,占用的是Student类方法中成员变量的内存之和
对于第二种方式则不同,该方式使用了指针,在定义
s时在栈中开辟一个4字节的空间,new Student()时在堆中开辟一块空间,然后将该空间的首地址赋值给s,这样,通过s就可以找到对象在堆中的任何成员方法了。
第一种方式图解:
Java中对象的对象引用及内存图分配_第4张图片
第二种方式图解:
Java中对象的对象引用及内存图分配_第5张图片
2.在java中:
Student s = new Student();
在这种方式中, JVM在进行内存管理时,首先会在栈中给s分配一个空间,当new Student()执行后,会在堆中开辟对象的实际空间,然后将s指向堆中的空间,这样我们就可以方法对象的成员变量了。

总结:1.java定义变量名只是创建了一个新的标识符,跟创建对象没有关系,创建对象必须通过 new 来完成,只有创建对象时才会申请内存空间。但在 C++ 中,当你定义了一个变量 s 时,即使你没有给它赋值,也意味着你不但创建了一个新的标识符,同时还在栈中申请了对应的内存空间。因此,C++ 中定义的变量名不仅仅是个标识符,还自动关联着栈中的一块内存空间。而 C++ 中的 new 操作符表示的是在堆中申请内存,因为栈中的内存在运行时期大小是固定且有限的,因此需要动态内存分配的时候就需要用 new 来实现。这类似于 C 里面的 malloc 函数,只不过 new 操作符还封装了其它的操作。
2.通过对比我们会发现Java创建对象的方式和C++的第二种创建对象方式相似,但是却不完全相同,在C++中s是一个指针,通过指针我们可以访问内存中的任何地址,可以肆意的对内存做处理,然而在Java中s是一个引用,可以理解成是C++中指针的一个封装,我们不可以像在C++中用指针那样在Java中直接的进行地址++操作,这样一来就保证了内存的安全,这是C++和Java的很大不同。
[java创建对象与c++创建对象的比较](https://www.cnblogs.com/1Q84mi/archive/2013/05/15/3080716.html)

你可能感兴趣的:(Java中对象的对象引用及内存图分配)