【Java】静态和非静态的区别

还是老生常谈JVM内存模型的问题,也是我一直深究(浅显)的问题,这里我们单一说一下用静态修饰的内存,前面的篇章有具体讲过
jvm内存分为:方法区、堆、栈、程序计数器
但是目前我们只要认识的是方法区, 堆和栈
方法区:是各个线程共享的区域,存放类信息/常量/静态变量
栈:其实每个线程都会分配一个栈,其生命周期与线程一样,其执行一个方法就会生成一个栈帧,其中栈帧真包含了方法中的局部变量.
堆:所有类的实例化都存放再堆里面
线程是进程的一个实体

1、从内存的角度分析用静态修饰和非静态的区别
用static修饰的成员变量一般情况下我们成为成员变量,其值存放的地址是方法区的常量池,其执行的顺序为在加载类的时候就将static修饰的变量名或者方法存放到常量池了,级别有限与构造函数和自定义函数
非静态修饰的变量:A、成员变量  B、局部变量
成员变量随对象存放的地址一样,因为它属于类的一部分,其地址在堆中
局部变量一般情况下在方法中申明,其存放的地址在栈中
(这里注解一下,所有的非变量名存放的地址在栈中,因为这里是局部变量)

2、从运行的机制出发
在源码被编译器编译成.class字节码文件的时候,一旦类被加载,用了static修饰的块/变量/方法就会马上存放到方法区,与此同时非静态的块/变量/方法,还没有编译,一旦将非静态的变量存放到静态方法里面,程序计数器指示到局部变量的时候就会报错,因为这个时候根本还没有编译到局部变量这一块。


 

猜你喜欢

转载自blog.csdn.net/qq_20617983/article/details/81636333