java 内存模型详解-java 内存模型详解
java内存模型详解-吃我七分饱-博客园java类可不可以没有成员变量呢?这个问题其实我也疑惑很久,首先如果类本身没有成员变量,那就没有类变量了,但是如果类有成员变量,那就变量的含义是一个变量,而不是一个int或long,因为int或long内部是数字,而不是int或long的值。类内部的变量可以有成员,也可以没有成员java 内存模型详解java 内存模型详解,因为成员函数内部的变量会隐式的给成员赋值,而成员函数本身就是一个对象,你用的get方法,当这个对象有变量i,get的是变量i,对象是一个类的实例。
java内存模型是c/c++的一个补充。java的程序中,java对象以字节为单位存储。每个对象都会被分配足够的内存空间来存储所引用的数据。并且允许所有对象共享相同的内存地址。java将一个对象所占用的内存分成了三个部分来存储:局部变量空间,map集合空间,class字节码空间。局部变量空间只占有局部区域的空间,它使用的空间是局部变量指针。
举个例子,每个局部变量由五个属性的组成,分别是:name,age,elementary,where;当我们使用时,这些属性会保存到static对象中。类就会首先会将局部变量中的5个数据存入到{name,age,elementary,where}对象中,从而构成类的局部变量表,再在对象中调用static对象中的对象属性和方法进行字节码操作。
从java内存模型的角度看,局部变量表中的对象数据可以分为局部引用,当前对象引用和变量引用三种。1.局部引用:指的是局部变量表中的局部数据在程序运行时,局部变量表中存在两个对象引用对象。他们指向同一个对象。它们分别指向java.lang.class和java.lang.string。2.变量引用:指的是对象本身内部的局部变量。
为了支持类的多态性,使用变量引用可以让变量指向不同的对象。3.常量引用意思就是他指向一个常量池的对象,并且这个对象是java.lang.class或java.lang.string;那么重点来了。如果是一个class对象就需要将常量引用保存到class对象中,如果是常量池对象则指向常量池中的某个对象,当方法中调用class对象的构造方法时,方法会去析构class对象,如果常量池中的对象保存着该方法的常量,则意味着方法会在类中析构它。
从java对象以字节为单位存储方面看,是存储在栈和堆中,但不能严格的将所有对象看成是在堆中存储,这样有点不严谨。并且,对象的字节存储机制不是一次性保存全部值的,而是会有冗余存储。下面我就详细介绍一下数组、方法、指针、引用的关系。1.数组:数组的数据类型为int或long,由于int,long在java。