Java中的局部变量和成员变量在内存中的位置

这篇写的不太行,就留着吧。上一篇写的比较权威

首先在这里先问大家一个问题: "java中的基本数据类型一定存储在栈中的吗?".

其实答案是不然的, 并不是;

基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型在内存中的存储问题来解释一下:

一**、**局部变量

方法中声明的变量 ,即该变量是局部变量 ,每当程序调用方法时,系统都会为该方法建立一个栈帧 ,其所在方法中声明的变量就放在栈帧中,当方法结束系统会释放该栈帧,其对应在该方法中声明的变量随着栈帧的销毁而结束,这就局部变量只能在方法中有效的原因.

1.1**、**在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。

(1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在JAVA虚拟机栈中(栈帧中)

(2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在JAVA虚拟机的栈中 ,该变量所指向的对象是放在堆内存中的。

二**、成员变量**

在类中声明的变量是成员变量,也叫全局变量.

那成员变量又是存在于哪里呢,网上有的说是在堆里,有的说在方法区里.

其实严格来说,两者都有存在,方法区里存有类信息,常量,静态变量,编译后的class文件等,既然是类信息,那么一个class类中的方法名,类名,成员变量名称等都属于该类的信息,也是存在于方法区中,也就是一个类中的成员变量名称是存在于方法区中的,但是在我们new一个对象后,这个对象上包含的成员变量的值是放入堆中的,也就是new的这个对象包含着这个对象的成员变量的信息(也就是值),但是这个对象上不会包含该类的方法,因为方法是共享的.

这里讨论存放在堆中的成员变量, 存放在方法区中的对象是一些类的基本信息, 这些东西是所有线程共享的.

2.1**、**同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量

(1)当声明的是基本类型的变量其变量名及其值放在堆内存中的

(2)引用类型时,其声明的变量仍然会存储一个内存地址值 ,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆

三**、**证明

此外,为了反驳观点" Java的基本数据类型都是存储在栈的 ",我们也可以随便举出一个反例,例如:

由于new了一个对象,所以new int\[\]{1,2}这个对象时存储在堆中的,也就是说1,2这两个基本数据类型是存储在堆中,ps:new出来的肯定是引用数据类型了啊

这也就很有效的反驳了基本数据类型一定是存储在栈中的。

引用:相关文章

相关推荐
wuyk5556 小时前
104.C 语言字节对齐:从底层原理到工程实践的完整指南
c语言·开发语言·stm32·单片机·嵌入式硬件
ZYJCSZKJ6 小时前
基于地理位置围栏的短视频POI团购系统:LBS空间索引与流量分发实践
java·服务器·数据库
mldong11 小时前
引擎从不发一条消息:jeeflow 的两类扩展点与消息模块的分工
java·架构
君顾112 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
南棱笑笑生12 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
zhanghe68713 小时前
es的密码带有特殊字符,导出
java
平头哥技术团队13 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
pnoker13 小时前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
乌萨奇也要立志学C++13 小时前
【洛谷】kmp算法
开发语言·算法
my_realmy13 小时前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式