黑马程序员——如何理解成员变量在堆内,局部变量在栈内?

文章探讨了Java中的内存管理,解释了成员变量存储于堆内存,而局部变量存储于栈内存的原因。通过实例分析,阐述了对象创建时的方法和局部变量的生命周期,以及JVM内存的堆、栈和方法区的角色。同时指出,基础数据类型直接存于栈,引用数据类型的引用存栈,对象存堆,这是一种简化表述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ASP.Net+Android+IO开发S.Net培训、期待与您交流!

在第五天的基础视频里,毕老师讲了一句话:成员变量在堆内存里,局部变量在栈内存里

我有疑惑:

既然成员变量存在于对象中,对象存在于堆中,所以成员变量存在于堆中。那么按照这样的推理,局部变量存在于方法中,而方法存在于对象中,对象存在于堆中,那是不是可以说局部变量存在于堆中?这与老师说的局部变量在栈内存里不符合啊?

然后我猜想:

当对象new出来,实体存在于堆的时候,对象里面的方法是没有出现的,或着只出现方法的声明,方法里面的局部变量并没有创建。等到对象调用此方法时,为了加快运行的速度,方法中的局部变量才会在栈中创建,所以,方法中的局部变量是在栈内的。

后来我查阅资料,有了一些比较系统的总结:

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 
堆区: 
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 
栈区: 
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 
方法区: 
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

原来,“成员变量在堆内存里,局部变量在栈内存里”这句话是一中比较片面的说法。不管成员变量还是局部变量,

如果是基础数据类型,那么直接存在于栈中,如果是引用数据类型,其引用放在栈里,对象实体放在堆里。


---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------
### 关于黑马程序员 JavaWeb 开发教程 #### 定义与概述 JavaWeb开发涉及使用Java技术来构建基于网络的应用程序。这些应用程序可以通过互联网或内联网访问,提供动态网页内容和服务。JavaWeb应用通常运行在服务器端,并利用Servlet、JSP(JavaServer Pages)、Spring框架等核心技术[^1]。 #### 学习路径概览 对于希望掌握JavaWeb开发技能的学习者来说,学习路径应当覆盖基础到高级的知识体系。这包括但不限于HTML/CSS/JavaScript前端基础知识;Java编程语言及其面向对象特性;数据库管理系统的理解和操作;以及核心的JavaEE组件和技术,如Tomcat容器配置、MVC设计模式实践等内容。 #### Web工作原理简介 当提到Web的工作流程时,指的是客户端请求经过一系列处理最终返回响应的过程。具体而言,在用户通过浏览器发出HTTP请求之后,该请求会被发送至相应的Web服务器。接着由部署在此处的应用程序逻辑解析并处理此请求,最后形成适当形式的数据作为回应传回给发起者的设备显示出来。 #### 浏览器对象模型(BOM) BOM使得开发者可以借助JavaScript同浏览器交互。它把整个页面视作一棵DOM树结构的同时也将窗口(window)本身抽象成一个顶级对象。除此之外还包括location、history等多个子级属性用于控制导航历史记录等功能[^2]。 ```javascript // 示例:获取当前URL地址 console.log(window.location.href); ``` #### 模块化编程概念展示 现代JavaScript支持ES6模块语法,允许更清晰地组织代码文件之间的依赖关系。下面是一个简单的例子展示了如何在一个项目里引入外部JS脚本而不需要立即声明局部作用域内的名称绑定——即仅为了触发某些初始化过程或是设置环境变量之类的副作用目的[^3]: ```javascript import './myModule.js'; ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值