java类和对象的内存分析


前言

众所周知,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类和对象在内存中的存在形式和对象创建的流程,欢迎大家留言讨论,如果对大家有用的话,记得点赞哦!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Astronaut Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值