java变量作用域和堆栈

2023-11-20

一、作用域决定了变量的可见性和生命周期,java中变量分为成员变量和局部变量,如下:
1.成员变量:在类的所有方法外部声明的变量,即类所拥有的变量,可以被系统初始化。
1.1静态成员变量:类被加载时被创建,其生命周期与该类的生命周期相同;
1.2类属性成员变量:在类的实例被创建时产生,其生命周期与该类的实例对象的生命周期相同;
2.局部变量:在定义该变量的方法被调用时创建,在方法调用结束后,该变量也被撤销,不能自动初始化,必须显示的指定初始值。
2.1参数列表局部变量:变量的作用域就是这个方法体;
2.2代码块局部变量:变量的作用域就是这个代码块。
3.变量使用原则:
    优先使用局部变量,能用局部变量就不要用成员变量,因为成员变量存放于堆内存中,局部变量存放在栈中,成员变量的作用域扩大到类存在的范围或对象存在的范围,其生命周期也会变长。这样带来两个缺点,一个是增加生命周期,系统开销也会增加;而是扩大了作用域,不利于程序的内聚性。
二、在JAVA中,有六个不同的地方可以存储数据: 
1. 寄存器(register)。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。 
2. 堆栈(stack)。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其中。 
3. 堆(heap)。一种通用性的内存池(也存在于RAM中),用于存放所以的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。 
4. 静态存储(static storage)。这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的,但JAVA对象本身从来不会存放在静态存储空间里。 
5. 常量存储(constant storage)。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中 
6. 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。 
就速度来说,有如下关系: 
寄存器 >堆栈 >堆 >其他 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java变量作用域和堆栈 的相关文章

  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • JDK 文档是语言规范的一部分吗?

    只有一名官员Java语言规范 https docs oracle com javase specs jls se8 html index html所有 Java 实现都必须遵守它 API文档怎么样 所有Java实现都需要遵守吗这个版本 ht
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 如何在 Java 中创建接受多个值的单个注释

    我有一个名为 Retention RetentionPolicy SOURCE Target ElementType METHOD public interface JIRA The Key Bug number JIRA referenc
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • 基于Hexo+Matery的LuckyBlog开源搭建教程

    前言 之前在B站上发布了个人博客的视频 播放量也破千了 有网友私聊也想要搭建一个这样的博客 经过一段时间的准备 现将本人博客的源代码公布出来 大家只需要根据以下的步骤 即可快速搭建一个漂亮完善的博客 0x01 LuckyBlog 介绍 上一
  • OJ编程之多组输入----牛客网----BC41 你是天才吗?

    OJ编程之多组输入 牛客网 BC41 你是天才吗 题目要求 错误代码 include
  • JavaScript 简介

    简介 JavaScript是一门脚本语言 这门语言主要用于 HTML 和 web 更可广泛用于服务器 PC 笔记本电脑 平板电脑和智能手机等设备 前端开发中JavaScript代码可以被插入到HTML页面代码中使用 并由浏览器来执行 示例
  • 关于打代码的一些些心得

    些许废话 零零散散也正式以打代码为生快一年半了 从代码写的稀碎到稍微能总结出一点东西 也算是一个一直在向上缓慢行走的状态了 很难说我喜欢代码这件事 原本选择也只是为了糊口 但从面向百度编程 到一点点写出带着自己风格的代码 再到可以略微静下来
  • Qt 实现压缩文件、文件夹和解压缩操作zip

    一 实现方式 通过Qt自带的库来实现 使用多线程方式 通过信号和槽来触发压缩与解压缩 并将压缩和解压缩结果回传过来 使用的类 include QtGui private qzipreader p h include QtGui privat
  • 同时有线内网无线外网的解决方案

    内网有线环境下先固定好自己的IP地址 子网掩码和网关地址 DNS 连接WIFI后 用管理员权限打开CMD命令行 第一步 输入route print 后按回车 会看到左侧网络目标里有两个0 0 0 0的地址 这样就会路由冲突 出现要么只能上内
  • “传统技术”快速搭建AI产品的利器——LLM技术

    文章首发地址 LLM原理 LLM Learning Localization and Mapping 技术的原理是将学习 定位和建图结合起来 实现机器人对环境的感知 定位和地图构建 下面是LLM技术的基本原理 学习 Learning LLM
  • html颜色怎么渐变效果,html怎么设置颜色渐变

    html设置颜色渐变的方法 首先创建一个HTML示例文件 然后使用div标签创建一个模块 接着在css标签内通过 id colorchange 来设置div样式 最后通过linear gradient属性设置div的背景颜色渐变效果即可 本
  • 讲解 最大流问题+最小花费问题+python(ortool库)实现

    文章目录 基本概念 图 邻接矩阵 最大流问题 python解决最大流问题 python解决最大流最小费用问题 喜欢的话请关注我们的微信公众号 你好世界炼丹师 公众号主要讲统计学 数据科学 机器学习 深度学习 以及一些参加Kaggle竞赛的经
  • ul里面可以放div吗?

    在HTML中 ul 标签代表无序列表 可以用来展示项目列表 而 div 标签则是div容器用于分组内容 提供独立于文档的CSS样式和JavaScript事件处理 那么 ul里面可以放div吗 答案是肯定的 下面从多个方面进行详细阐述 一 语
  • MacBook安装使用XMind

    MacBook安装使用XMind XMind简介 官方地址 https www xmind cn XMind 是一个全功能的思维导图和头脑风暴软件 为激发灵感和创意而生 作为一款有效提升工作和生活效率的生产力工具 受到全球百千万用户的青睐
  • 计算机内存插在主板的哪个槽,四个内存插槽,这是正确的安装顺序

    具有防呆设计的主板插槽几乎不可能错误地插入 因此很有可能在第一个插槽中安装了内存 尽管可以 但是会阻止内存在最佳状态下工作 主板手册中有这样一句话 说明 为便于理解 首先对内存插槽编号 从靠近CPU插槽的位置开始 主板 针对不同情况的最佳安
  • 区域生长算法及其实现

    区域生长算法及其实现 背景 前面我们已经介绍了 最大熵分割法 OTSU算法 他们都有各自的优缺点 通常都不是单独使用这些算法 需要和其它算法来结合使用 前面两类算法都是单独对图像的灰度信息进行处理 不包含图像的空间信息 而区域生长算法则包含
  • 云计算与大数据概论第十一周

    分布式计算 分布式计算是一种计算方法 和集中式计算是相对的 随着计算技术的发展 有些应用需要非常巨大的计算能力才能完成 如果采用集中式计算 需要耗费相当长的时间来完成 分布式计算将该应用分解成许多小的部分 分配给多台计算机进行处理 这样可以
  • 如何快速开发一个简单实用的MES系统?

    01 如何快速开发一个简单实用的MES系统 MES生产管理系统 又称制造执行系统 是一种集成了计划 生产 质量控制 库存管理和材料申请等生产流程的管理系统 是企业中实现高效生产的重要一环 根据题主描述 通过产品条形码实现对生产计划下的产品追
  • 小程序的基础(三)

    文章目录 前言 一 navigator 二 rich text 作用 1 nodes属性 注意 三 button open type 的 contact的实现流程 代码示例 1 contact 直接打开 客服对话功能 需要在微信小程序的后台
  • int argc,char*argv[ ]的简洁解释

    1 arguments argument counter 计数个数 和 argument vector 矢量 带有方向的变量参数 也就是指针 argc命令行输入参数的个数 int main int argc char argv int i
  • 【操作系统】王道考研 p42 段页式管理方式

    段页式管理方式 知识总览 分段 分页管理方式中最大的优缺点 关于段式管理会产生外部碎片 ps 分段管理中产生的外部碎片也可以用 紧凑 来解决 只是需要付出较大的时间代价 分段 分页 段页式管理 示意图 先分段 后分页 段页式管理的逻辑地址结
  • oracle 的路径不一致,DG环境搭建,在备库遇到问题,主备库的路径不一致

    现在在做oracle DG的环境搭建 因为实际生产的原因 主备库的路径是不一致的 我把主库的rman文件传到备库后 在备库进行恢复 无法恢复 求指导 oracle std bak rman target sys 123456 pri aux
  • java变量作用域和堆栈

    一 作用域决定了变量的可见性和生命周期 java中变量分为成员变量和局部变量 如下 1 成员变量 在类的所有方法外部声明的变量 即类所拥有的变量 可以被系统初始化 1 1静态成员变量 类被加载时被创建 其生命周期与该类的生命周期相同 1 2