对象的内存布局

对象、字符串和数组都是引用类型,指向的数

我们以下面main方法部分代码片段为例:

1
2
3
4
Cat cat = new Cat();
cat.name = "小白";
cat.age = 12;
cat.color = "白色";

点击并拖拽以移动

img点击并拖拽以移动编辑

首先执行mian方法,会在栈里创建一个独立的main栈空间(这里说成main栈是为了便于区分栈),在执行Cat cat = new Cat(),执行完后会在堆中产生一个对象空间,cat指向该对象空间,cat的基本类型age数据会直接存到堆信息中,由于name,color是字符串所以会在方法区中常量池在开创一个空间,用来存储他们的数据,此时堆中name与color指向该空间地址

注:当new一个对象时会加载Cat类的属性信息和行为(方法信息)

我们以下面代码为例:

1
2
3
4
5
Persion p1 = new Persion();
p1.age = 10;
p1.name = "小明";
Persion p2 = p1; //把p1赋给了p2,让p2指向p1
System.out.println(p2.age)

点击并拖拽以移动

内存图:

img点击并拖拽以移动

当我们new一个p1对象时,在堆中会创建一个内存空间,此时p1指向创建好的内存空间,如果属性信息是引用类型则数据会存到方法区,而栈里面的该属性内存地址存放的就是具体数据的地址,在执行Persion p2 = p1,会p2直接指向p1指向的内存空间。

java内存结构分析:

1.栈:一般存放基本数据类型(局部变量)

2.堆:存放对象(Cat cat,数组等)

3.方法区:常量池(常量,比如字符串),类加载信息

方法调用机制

我们以一下面代码段为例:

1
2
3
4
5
6
7
8
Person p1 = new Persion();
int returnRes = p1.getSum(10,20);

//getSun(10,20)方法
public int getSum(int num1,int num2){
int res = num1 +num2;
return res;
}

点击并拖拽以移动

img点击并拖拽以移动

首先main方法执行时,会在栈中创建一个main栈空间,在执行Person p1 = new Persion();执行完后会有一个对象空间产生,p1指向该对象空间,然后在执行int returnRes = p1.getSum(10,20);执行完后会在开一个栈空间(getSum栈独立空间,这里叫getSum栈便于区分栈空间),然后将10赋值给num1,将20赋值给num2,res就等于30,在执行return语句,将结果返回到int returnRes = p1.getSum(10,20)这个位置即返回给returnRes,当main方法结束后,整个程序退出(遵循栈的先进后出原则)