7.6 创建对象内存分析

news2024/11/27 21:01:44

7.6 创建对象内存分析

主程序实例

package com.baidu.www.oop;

import com.baidu.www.oop.demo03.Pet;

public class Application {
    public static void main(String[] args) {
        Pet dog =new Pet();
        dog.name = "旺财";//这里的对象的属性在类中需要定义为public,否则无法调用
        dog.age = 3;
        dog.shout();
        System.out.println(dog.name);
        System.out.println(dog.age);
        Pet cat = new Pet();
    }
}

其他类实例

package com.baidu.www.oop.demo03;

public class Pet {
    public String name;//这里设置为public是因为public的权限是比较高的
    public int age;
    public void shout(){
        System.out.println("叫了一声");
    }
}

程序运行需要加载一些程序运行的模板,所以第一步就需要把主程序中Application类中的代码信息放进内存,这里我们只是图示理解,真实的内存远比这个复杂的多。

  1. 在方法区加载Application这个类,这个类中有一个方法叫做main方法,此外还有一些常量池,旺财
  2. 在栈中压入main方法,main方法第一行代码是new了一个Pet对象
  3. 运行new Pet()语句
    1. 在方法区加载Pet类,Pet类中有属性和方法,也就是当new方法时,这个类就被加载进了内存,此时的Pet类被加载时,属性还没有被赋值。当实例化对象dog后
    2. 实例化对象dog后,就在栈中压入了变量dog,dog是一个引用或者一个变量名,而真正的对象是在**“堆”**中的
    3. 通过方法区中的类实例化了一个对象dog在栈中,而栈中的dog是被引用到了堆中的对象。而此时的堆中new的Pet中变量等还未被赋值,此时的name=null,age=0,此时还有一个自己的方法shout(),而这个shout方法调用的是方法区中Pet类中的方法。
    4. 经过以上几步,new Pet()这条语句就走完了,这也就是进入无参构造时所做的事情。
  4. 执行下一条语句dog.name赋值,这个过程就是从方法区Application中的常量池中的旺财丢给了堆中的Pet对象的name
  5. 执行赋值语句dog.age=3
  6. dog.shout()是调用了方法区中的Pet类的shout()方法,因为这两个方法是一样的,并没有传递任何参数。到此,dog对象在堆中就被赋予了值了。
  7. 当执行Pet cat = new Pet();语句时,此时就在栈中又压入一个引用变量名cat,这是一个引用,而引用是需要指向真实的地址,此时在堆中又会有一块空间来存放这个新的对象,地址为000X2,此时还是默认值
  8. 这里我们也理解了,为什么被称为引用变量名,它真正指向的是堆中的具体的对象。
  9. 此外,在方法区中,还有一个空间叫做静态方法区,这个区域是用于存放被Static关键字修饰的都会被存放在这里,是和类一起加载进来的,这也就是说所有的对象都可以调用这个静态方法区的数据。
  10. 实际上,在内存中,左侧的是栈,而右侧的都是堆,只不过在堆中有一个特殊的空间叫做方法区,堆一般是存放我们具体创建出来的对象,而栈中都是一些方法加一些变量的引用

如图
内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/847340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-08-08 Ubuntu 挂载U盘 fdisk -l 、sudo mount /dev/sdb1 /mnt/mydisk

一、基本命令 1、插入U盘,查看U盘是否被系统识别: 打开终端,输入: sudo fdisk -l 查看系统是否识别U盘,如果识别,会显示U盘的相关信息,如果没有识别,则说明系统没有识别U盘。 2…

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块8

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

我设置了IIS的默认文档为什么还是提示403 - 禁止访问: 访问被拒绝。

我设置了IIS的默认文档为什么还是提示403 - 禁止访问: 访问被拒绝。 这个问题我是在处理dedeCMS站点时发现的问题 解决方法: 打开IIS》应用程序池》(找到你的站点应用池)》右键》基本设置》版本:选择2.0》管道:选择“…

Qt6之QListWidget——Qt仿ToDesk侧边栏(1)

一、 QLitWidget概述 注意:本文不是简单翻译Qt文档或者接口函数,而侧重于无代码Qt设计器下演示使用。 QListWidget也称列表框类,它提供了一个类似于QListView提供的列表视图,但是它具有一个用于添加和删除项的经典的基于项的接口…

​币安或面临「美司法部」欺诈指控

作者:维特根斯坦他弟 美国媒体semafor独家报道,知情人士透露,美国司法部正计划对币安提出欺诈指控,但又担心消费者会为此付出的巨大代价。 知情人士表示,联邦检察官担心他们起诉币安,可能会引发该交易所发生…

Django进阶

1.模板 1.1 寻找html模板 TEMPLATES [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR, templates)],APP_DIRS: True,OPTIONS: {context_processors: [django.template.context_processors.debug,django.template.context_process…

开窗积累之学习更新版

1. 开窗使用1之 count range between current row and current row 将相同排序字段的值进行函数计算 selectsku_id,substr(create_date,1,7) date_month,order_id,create_date,sku_num*price,sum(sku_num*price) over (partition by sku_id order by substr(create_date,1,7)…

M2I触摸屏与PLC通信手册下部

其它推荐设置见内部同步、端子块、清除发送CTS置于0V位置。 固定设置在偶校验,数据比特7位,停止比特位在第2比特位上。 (3) C500-LK203 拨动开关设置 开关 设置项目 开关设置状态ON OFFSW1 1~5 制定站号 0 1 2 … 30 31 1 站号设置 OFF ON OFF … OFF…

stable-diffusion-webui 界面汉化

本教程通过安装 sd-webui-bilingual-localization 插件来达到汉化目的, 项目地址为:https://github.com/journey-ad/sd-webui-bilingual-localization 一、安装插件 先进入插件安装界面 在搜索栏搜索 zh_CN Localization 中文语言包, 项目地址: https://github.com/dtlnor/st…

vue+iviewUi+oss直传阿里云上传文件

前端实现文件上传到oss(阿里云)适用于vue、react、uni-app,获取视频第一帧图片 用户获取oss配置信息将文件上传到阿里云,保证了安全性和减轻服务器负担。一般文件资源很多直接上传到服务器会加重服务器负担此时可以选择上传到oss&…

怎么修改ip地址 手机ip地址如何改

如今的数字化时代,IP地址是连接我们与互联网世界的桥梁。然而,有时我们可能需要修改IP地址以满足特定需求,比如提高网络速度、绕过地理限制等。本文将为您提供修改IP地址的简单步骤和常见问题解答,帮助您轻松完成IP地址修改。 一、…

SciencePub学术 | Elsevier旗下计算机类重点SCIE征稿中

SciencePub学术 刊源推荐: Elsevier旗下计算机类重点SCIE征稿中!信息如下,录满为止: 一、期刊概况: 计算机语音类重点SCIE 【期刊简介】IF:4.0-4.5,JCR2区,中科院3区; 【出版社…

NANK南卡签约傅园慧,倡导更健康的听音体验

近日,中国知名骨传导耳机品牌——NANK南卡,正式官宣著名游泳冠军傅园慧成为Nank南卡的品牌推荐大使。 傅园慧是一位备受瞩目的运动员,在游泳领域取得了令人瞩目的成就,不仅如此她独特的个性和乐观向上的态度而闻名,深受…

2023全新UI好看的社区源码下载/反编译版

2023全新UI好看的社区源码下载/反编译版 这次分享一个RuleAPP二开美化版(尊重每个作者版权),无加密可反编译版本放压缩包了,自己弄吧!!! RuleAPP本身就是一款免费开源强大的社区,基…

一文5000字从0到1构建高效的接口自动化测试框架思路

在选择接口测试自动化框架时,需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说,使用Python相关的测试框架更为便捷。无论选择哪种框架,重要的是确保 框架功能完备,易于维护和扩展,提高测试效率和准确性。…

现代C++中的从头开始深度学习【1/8】:基础知识

一、说明 提及机器学习框架与研究和工业的相关性。现在很少有项目不使用Google TensorFlow或Meta PyTorch,在于它们的可扩展性和灵活性。也就是说,花时间从头开始编码机器学习算法似乎违反直觉,即没有任何基本框架。然而,事实并非…

同芯同意创未来——赛意力量 SNP ·南京半导体高科专场

7月28日,“赛意力量全国行”将在南京组织以“同芯同意创未来”为主题的南京半导体高科专场沙龙活动。届时,“赛意力量”将携众优秀企业IT及财务领域嘉宾,开展深度交流,共同为推动科技创新与区域经济发展而出谋划策。 南京作为中国…

并发——线程与进程的关系,区别及优缺点?

文章目录 1. 图解进程和线程的关系2.程序计数器为什么是私有的?3. 虚拟机栈和本地方法栈为什么是私有的?4. 一句话简单了解堆和方法区5. 说说并发与并行的区别? 从 JVM 角度说进程和线程之间的关系 1. 图解进程和线程的关系 下图是 Java 内存区域,通过下图我们…

【echarts】手把手喂饭教学!最容易懂的微信小程序 echarts 项目实践入门教程

前言:echarts是一个使用 canvas 制作图表的组件库,是前端中最常见的数据可视化( DashBoard ) 工具之一。相信很多同学都已经接触过了,但一直局限于使用官网的模板,无法完成个性化的精美图表。如果你也正被 无法使用echarts完成个性…

word单独一页设置页面设置

点击“分隔符——下一页”,这一页就成为了独立的一节,就可以单独设置页面布局了