对象的内存布局

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

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

image-20240326183642090

对象名和地址会存到栈信息中,cat的基本类型age数据会直接存到堆信息中,由于name,color是字符串所以地址会存到栈信息,而存到栈里面的地址会指向方法区

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

类与对象

属性/成员变量

成员变量=属性=fieId(成员变量是用来表示属性的)

属性是类的一个组成部分,一般是基本数据类型,也可以是引用类型(对象,数组)

注意细节:

1.属性的定义语法同变量,但是属性可以带上访问修饰符【访问修饰符 属性类型 属性名;】

2.属性如果不赋值,有默认值,规则和数组一致

1
2
//int 0、short 0、byte 0、long 0
//float 0.0、double 0.0、char \u0000、boolean false、String null

访问属性

1
2
3
4
5
6
7
8
9
10
11
12
//第一种创建对象
//先声明在创建
Cat cat;//声明对象cat
cat = new Cat();//创建
//第二种创建
//直接创建
Cat cat = new Cat();
//访问属性
//对象名.属性名;
cat.name;
cat.age;
cat.color;

类和对象的内存分配机制

我们以下面代码为例:

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)

内存图:

image-20240326183231192

但我们new一个p1对象时,在堆中会创建一个内存空间并存储属性与方法相关的信息,并把对象地址信息加载到栈信息当中指向创建好的内存空间,如果属性信息是引用类型则数据会存到方法区,而栈里面的该属性内存地址存放的就是数据的地址

java内存结构分析:

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

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

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

方法调用机制

外面一下面代码段为例:

image-20240326183104622

== 首先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方法结束后,整个程序退出(遵循栈的先进后出原则)==