文章目录
前言
众所周知,java是一种面向对象的编程语言,那对象在内存中的存在形式是什么样子的呢?本文主要讲述java对象在内存中的存在形式和对象创建的流程分析。
一、jvm的内存分区
jvm的内存区域大致可分为以下三种
1.栈:一般用于存放局部变量中的基本数据类型
2.堆:一般引用类型,新对象开辟出的内存位于堆区
3.方法区:有常量池(可存放常量,字符串),还可加载类信息
二、java对象在内存的存在形式
1.对象的初始化
代码如下(示例):
class Test{
public static void main(String args[]){
Person p=new Person();
p.name="Tom";
p.age=21;
p.sex="man"
}
}
class Person{
String name;
int age;
string sex;
}
2.实例内存图样
2.实例分析
1>当运行完Person p=new Person();后,会首先在方法区内加载类信息(包括该类的属性和方法),这之后再分配空间,在栈区会有一个p(引用类型)指向堆区的一个地址,堆区会分配三条地址空间(因为Person类中有三个属性)。
2>p.name=“Tom”;因为name是String类型的,所以该对象在堆区分配的第一段内存中存放着一个地址指向方法区中的常量池其中的"Tom"。
3>p.age=21;因为年龄属于基本数据类型,所以会将该数据直接存放在该对象在堆区分配的第二段内存内。
4>p.sex=“man”;同2>,"man"存放在方法区中的常量池中,该对象在堆区分配的第三段内存中存放的地址指向“man”;
三、java对象创建的流程分析
1、对象创建示例(包含构造器)
class Test1{
public static void main(String args[]){
Person p=new Person("Tom",21);
}
}
class Person{
String name;
int age=99;
Person(String n,int a){
name=n;
age=a;
}
}
2、实例内存图样
3、对象创建流程分析
1>加载Person类信息(即Person.class),注意只会加载一次。
2>在堆区分配内存空间,也就意味着拥有了这段空间的地址。
3>完成初始化:首先会进行默认初始化操作,即p.age默认为0,p.name默认为null;接着会进行显性初始化p.age=99,p.name依旧为null;最后会进行构造器初始化p.age=21,p.name=Tom。
4>将对象在堆中的地址返回给p(即将p指向堆中开辟的空间),注意p为对象名,也可理解为对象的引用,真正的对象实际上为堆区这部分。
总结
以上是博主理解的java类和对象在内存中的存在形式和对象创建的流程,欢迎大家留言讨论,如果对大家有用的话,记得点赞哦!