static的在内存中的存放位置

JVM内存总体一共分为了 4个部分:

stack segment、
heap segment、
code segment、
data segment)

stack segment(栈):

局部变量:如main函数中声明的str变量。如图中,str,t存在于stack区:

这里写图片描述

这里写图片描述

栈中保存基本数据类型的变量自定义的对象的引用(不是对象)对象本身都存放在堆区中,被执行的方法的也是pull到栈中,当方法执行完后再push出栈。

heap segment(堆)

当new 一个对象的时候,此对象放在了heap segment(堆)当中。t存放在stack中,而new Test()这个实实在在的对象是存在了heap中
如。代码:

这里写图片描述

heap中存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

code segment(代码区)

类中方法的话,是存在在 code segment(代码区)中了

data segment(数据区)

static 的变量或者字符串常量存在数据区

static变量与非static变量

static的变量与非static变量存放位置不一样,并且变量的访问权限也不一样。

static变量是全局的,是类的所有对象都能访问的,是所有方法都可以访问的,无论是static修饰的方法还是非static方法都可以访问,没有限制。

而非static变量是私有的,是有访问限制的,就是说是每个对象独有的特有的,并且只有非static方法才可以访问。

如图:
这里写图片描述
static方法只能访问static的变量,没有权限访问非static变量。

这里写图片描述
static方法中声明的变量可以与非static变量并且是类的属性重名

这里写图片描述
方法中声明的变量可以与非static变量并且是类的属性重名

这是由于类的属性是存在与对象中的,是在heap中,而方法中的变量是存在与code 区中的,在不同的区中可以重名。

这里写图片描述
非static方法中可以方访问static变量。

这时因为static变量是共享的,任何方法,任何对象都可以访问

这里写图片描述
static方法可以访问static属性

这里写图片描述

static方法中声明的变量name存在code区,而类的属性中的name存在对象中,而对象存在于heap区。所以不会报错。

参考:
java static变量在内存中

http://blog.youkuaiyun.com/shennongzhaizhu/article/details/52244727

<think>嗯,用户问的是静态方法在内存中的哪个位置。首先,我需要回忆一下Java内存结构的相关知识。静态方法属于类的一部分,应该是在方法区或者元空间里。不过具体细节可能要看Java版本,因为方法区在Java 8之前是PermGen,之后被元空间替代了。那静态方法是不是和类信息一起存在这里呢? 接下来,用户可能对内存分区不太熟悉,需要分步骤解释清楚。比如,先介绍Java内存的几个主要区域:堆、栈、方法区/元空间,还有本地方法栈和程序计数器。然后指出静态方法属于类的一部分,存放在方法区或元空间。 需要注意的是,静态变量和静态方法的位置可能不同吗?比如静态变量也是在方法区,而静态方法的代码存储在哪里呢?可能它们的字节码都存放在方法区,而执行时栈帧是在Java栈里。这点需要澄清,避免混淆。 另外,要区分静态方法和实例方法。实例方法是属于对象的,但代码还是在方法区,调用时通过对象的引用找到方法。而静态方法不需要实例,直接通过类调用,所以它们的存储位置应该是一样的,都是在方法区。 可能用户还会混淆静态变量和静态方法的存储位置,需要明确两者都在方法区,但静态变量是数据,而方法是代码。运行时执行方法会在栈中创建栈帧,但方法本身的字节码在方法区。 最后,总结一下,确保解释清晰,结构合理,避免使用术语混乱,同时检查LaTeX格式是否正确,按照系统级指令的要求来排版。</think>好的,我来逐步解释静态方法在内存中的位置: 1. **Java内存核心区域划分**: - **堆(Heap)**:存放对象实例和数组。 - **Java虚拟机栈(Stack)**:存放方法调用的栈帧(局部变量、操作数栈等)。 - **方法区(Method Area)**:存放类信息、常量、静态变量等。在Java 8及以后,方法区由**元空间(Metaspace)**实现(取代了早期的PermGen)。 - **本地方法栈(Native Method Stack)**:为Native方法服务。 - **程序计数器(PC Register)**:记录当前线程执行的位置。 2. **静态方法的存储位置**: - 静态方法属于**类级别**的成员,而非对象实例。 - 它的字节码(即方法代码)与类信息一起存储在**方法区/元空间**中。 - 例如: ```java public class Example { public static void staticMethod() { /* 代码 */ } } ``` 这里的`staticMethod()`字节码会随`Example`类的加载进入方法区。 3. **静态方法调用的过程**: - 当调用静态方法时(如`Example.staticMethod()`): 1. JVM在方法区中查找该方法的字节码。 2. 在栈中为当前线程分配一个栈帧,用于保存局部变量和执行操作。 3. 执行完毕后栈帧弹出。 4. **对比实例方法**: - 实例方法代码同样存储在方法区,但调用时需通过对象引用(堆中的对象)隐式传递`this`参数。 5. **关键区别总结**: | **特性** | **静态方法** | **实例方法** | |----------------|----------------------------------|----------------------------------| | 存储位置 | 方法区/元空间 | 方法区/元空间 | | 调用依赖 | 类名直接调用(无需对象) | 对象实例调用(需`this`指针) | | 内存关联性 | 与类生命周期一致 | 与对象生命周期无关 | 6. **注意事项**: - 静态方法不能访问实例变量(因无`this`上下文)。 - 方法区/元空间由JVM管理,通常不需要开发者干预其内存分配。 **总结**:静态方法的字节码存储在方法区(Java 8+的元空间),执行时在栈中分配栈帧。它与类信息共存,生命周期从类加载开始到类卸载结束。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值