java静态变量在方法区_Java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配...

本文详细介绍了Java中的变量分配,包括原始数据类型变量和引用数据类型变量在方法区、栈内存、堆内存中的分布。重点讨论了静态变量、实例变量和局部变量的区别,以及final关键字在多线程访问中的作用。通过示例代码解释了内存分配图,展示了不同线程如何访问共享和非共享数据。
摘要由CSDN通过智能技术生成

转自:https://blog.csdn.net/leunging/article/details/80599282

感谢CSDN博主「leunging」的总结分享

————————————————

Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”。

根据“Java中的变量与数据类型”中的介绍,“变量是在内存中分配的保留区域的名称。换句话说,它是一个内存位置的名称”,也就是说我们通过这个变量名字就可以找到一个指向这个变量所引用的数据的内存指针,根据变量的类型我们可以知道这个指针之后的几个字节里存储了这个变量所引用的数据。

所以,了解变量在方法区、栈内存、堆内存中的分配要了解两部分内容,一个是“变量在内存中的分配”,另一个是“变量所引用的数据在内存中的分配”。以下简称为“变量分配”与“数据分配”。

原始数据类型变量

原始数据类型变量的“变量分配”与“数据分配”是在一起的(都在方法区或栈内存或堆内存)

引用数据类型变量

引用数据类型变量的“变量分配”与“数据分配”不一定是在一起的

示例代码

class Fruit {

static int x = 10;

static BigWaterMelon bigWaterMelon_1 = new BigWaterMelon(x);

int y = 20;

BigWaterMelon bigWaterMelon_2 = new BigWaterMelon(y);

public static void main(String[] args) {

final Fruit fruit = new Fruit();

int z = 30;

BigWaterMelon bigWaterMelon_3 = new BigWaterMelon(z);

new Thread() {

@Override

public void run() {

int k = 100;

setWeight(k);

}

void setWeight(int waterMelonWeight) {

fruit.bigWaterMelon_2.weight = waterMelonWeight;

}

}.start();

}

}

class BigWaterMelon {

public BigWaterMelon(int weight) {

this.weight = weight;

}

public int weight;

}

内存分配图

99226d92f88f3127d8f496aa1c38364c.png

同一种颜色代表变量和对象的引用关系

由于方法区和堆内存的数据都是线程间共享的,所以线程Main Thread,New Thread和Another Thread都可以访问方法区中的静态变量以及访问这个变量所引用的对象的实例变量。

栈内存中每个线程都有自己的虚拟机栈,每一个栈帧之间的数据就是线程独有的了,也就是说线程New Thread中setWeight方法是不能访问线程Main Thread中的局部变量bigWaterMelon_3,但是我们发现setWeight却访问了同为Main Thread局部变量的“fruit”,这是为什么呢?因为“fruit”被声明为final了。

当“fruit”被声明为final后,“fruit”会作为New Thread的构造函数的一个参数传入New Thread,也就是堆内存中Fruit$1对象中的实例变量val$fruit会引用“fruit”引用的对象,从而New Thread可以访问到Main Thread的局部变量“fruit”。

————————————————

版权声明:本文为CSDN博主「leunging」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/leunging/article/details/80599282

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值