当前位置: 首页 > article >正文

对象内存与方法调用机制

对象的内存布局

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

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

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

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

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

我们以下面代码为例:

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

内存图:

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

java内存结构分析:

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

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

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

方法调用机制

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

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;
}

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

 


http://www.kler.cn/a/228492.html

相关文章:

  • 55.【5】BUUCTF WEB NCTF2019 sqli
  • 用JAVA写算法之输入输出篇
  • iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析
  • 《Effective Java》学习笔记——第1部分 创建对象和销毁对象的最佳实践
  • 麒麟操作系统服务架构保姆级教程(十三)tomcat环境安装以及LNMT架构
  • JDK长期支持版本(LTS)
  • Vivado Tri-MAC IP的例化配置(三速以太网IP)
  • ESP32QRCodeReader库使用,ESP32-CAM识别二维码并向自写接口发出请求确认身份。
  • 关于Linux和消息队列常见的十道面试题
  • Verilog实现2进制码与BCD码的互相转换
  • 基于NSGA-II的深度迁移学习
  • 前端实现标题滚动点击导航
  • 爬虫工作量由小到大的思维转变---<第四十五章 Scrapyd 关于gerapy遇到问题>
  • 100个Cocos实例(32/100) 3D模型受击闪白效果简易实现
  • 全网第一篇把Nacos配置中心客户端讲明白的
  • J组一等奖冲刺:原码、反码与补码
  • centos7安装google chrome和chromium
  • SPECCPU2017操作说明
  • MyBatisPlus的链式查询LambdaQueryChainWrapper
  • python常用pandas函数nlargest / nsmallest及其手动实现
  • 【MySQL】DQL的总结和案例学习
  • 开源节点框架STNodeEditor使用
  • 【数字电子技术课程设计】多功能数字电子钟的设计
  • python-题库篇-数学
  • 【QT+QGIS跨平台编译】之二十六:【SpatialIndex+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • Java技术栈 —— Hive与HBase