static关键字内存分析
来源:互联网 发布:空间和域名 编辑:程序博客网 时间:2024/06/06 05:41
通常情况下,Java把内存分为栈内存、堆内存和方法区
栈内存用来存放一些基本类型的变量和数组(数组也是一种引用类型)及对象的引用变量
堆内存主要是来放置对象的,即我们在程序中new出来的对象。
static,意味为静态的,用static修饰的变量和方法,实际上是给这些变量和方法指定了在内存中的”位置“(这个位置也叫静态区、方法区、数据区和共享区)。既然在内存中指定了位置,那么他们的 “大小”似乎就是固定的了,有了位置和大小的特征,在栈中或堆中开辟空间那就是非常的方便了。对于静态的东西,JVM在加载类时,就在內存中开辟了这些静态变量的空间(内存空间),即编译时就为这些成员变量的实例分配了空间。
下面我们来看一段代码
package demo;public class StaticDemo { public static void main(String[] args) { Visitor visitor1 = new Visitor(); System.out.println("count : " + visitor1.count);// 1 System.out.println("visitCount : " + Visitor.visitCount);// 1 Visitor visitor2 = new Visitor(); System.out.println("count : " + visitor2.count);// 1 System.out.println("visitCount : " + Visitor.visitCount);// 2 Visitor visitor3 = new Visitor(); visitor3.count = 5; visitor3.visitCount = 0; // 归0 System.out.println("count : " + visitor1.count);// 1 System.out.println("count : " + visitor2.count);// 1 System.out.println("count : " + visitor3.count);// 5 System.out.println("visitCount : " + visitor1.visitCount);// 0 System.out.println("visitCount : " + visitor2.visitCount);// 0 System.out.println("visitCount : " + visitor3.visitCount);// 0 }}class Visitor { int count; static int visitCount; public Visitor() { count++; visitCount++; }}
从上面代码来看,用static修饰的变量,每个类的实例改变的都是同一个副本,即在内存中static修饰的变量只有一份,而对于普通的成员变量,每个实例都有各自的副本,我们用图来简单的分析StaticDemo类的代码,首先JVM把Visit类与StaticDemo类编译完然后加载到方法区,在Visit方法区中,JVM检查到有个static修饰的变量visitCount,则又开辟了一块内存(叫做静态区)来存放,此时内存情况
接着JVM会自动寻找main方法并在栈中为其开辟一个空间,再看代码第5行
这时,来了一个访问者visitor1,JVM在栈中为visitor1开辟了一块内存,并且指向堆中的Visitor内存空间,由于count与visitCount为成员变量,所以有默认初始值0,根据代码
第6行与第7行的运行结果
我们可以得到count与visitCount变量在堆内存中的值
同理9,10,11行
与5,6,7行分析类似,此时内存情况及count与visitCount变量的值
接下来来了一个visitor3,把count与visitCount都重新赋值了
由于visitor1,visitor2,visitor3在堆空间中都有各自的count变量,所有当visitor3改变了count变量的值时,visitor1与visitor2的count变量值并没有受影响,而当visitor3对visitCount重新赋值了,因为visitor1,visitor2,visitor3的visitCount都为静态区中的0x0001,所以用visitor1,visitor2,visitor3访问的visitCount为最新的值0。可见,静态变量与具体的实例无关,属于整个类,在编程中,当所有对象共享某个数据的时候,我们就可以把这个成员变量定义为静态的,如上面的visitCount。
- static关键字内存分析
- static关键字以及内存分析
- static关键字的使用与内存分析
- static关键字-内存图解
- Java学习5:static关键字内存分析详解及用法
- static关键字作用分析
- 【static】----static关键字--内存中简单过程
- java中的static关键字分析
- java基础-static关键字分析
- 从内存分配角度分析c和java里的static 关键字.
- static关键字的用法-包括内存分配
- 关键字 this 与 static 及其内存解析
- java的Static关键字使用内存图解:
- static关键字的用法-包括内存分配
- 关键字static和const的作用分析
- static关键字的作用(精辟分析)
- auto,static,register分析(属性关键字)
- 属性关键字 auto,register,static分析
- android 视图 sufaceview
- c编程之乘法表+素数+闰年
- Logstash学习20_[logstash-input-file]插件使用详解
- tps(第三人称射击游戏) 4.角色射击
- JS运算符之&&和||
- static关键字内存分析
- java学习路线
- zsh的安装和使用简介
- 服务计算作业5——cloudgo-inout
- Android 使用librtmp推流【音视频传输】
- 分治法实例-找下标,下标与对应值相等
- 水平垂直居中
- 微机原理输入并显示字符串
- Python 石头剪刀布,小游戏