java类中成员变量初始化后存放在堆内存中还是栈内存中?

本文详细解析了Java类初始化过程,从堆内存分配空间到成员变量赋值的全过程,包括静态成员变量eyeNum的初始化及类属性修改。

答案是堆内存。

 

之前明明看过java类初始化过程的,

但一下子看到这样的题目,还是懵了。

百度后,那些帖子的回复各有各说,

脑袋都看得要塞住了,还是看书求证吧。

 

李刚的《疯狂Java》第128页开始,有一个类从初始化开始,

在内存发生什么变化的详细过程,这里简单记录一下。

1
2
3
4
class  Person{
     String name;
     static  int  eyeNum;
}

 

上面这个Person类,有成员变量name和静态成员变量eyeNum了,

当执行下面语句:

1
2
3
4
5
6
Person p1 =  new  Person();
Person p2 =  new  Person();
p1.name =  "A" ;
p2.name =  "B"
p1.eyeNum =  2 ;
p2.eyeNum =  3 ;

 

  1. Person p1 = new Person();第一次使用Person类,系统在堆内存为Person类分配空间,其中也包括了静态成员变量eyeNum(初始值为0)。

  2. 然后,在堆内存new一个Person对象,其中name为null,然后将p1指向这个对象。

  3. 接着new p2时,因为类已经初始化了,只需重复第2步就行了。

  4. p1.name = "A"; 让堆内存中p1对象的name指向一个"A"字符串。

  5. p1.eyeNem = 2;此时通过Person对象修改Person的类属性(因为是静态成员变量),Person类的eyeNum属性被赋值为2。

     

   Person类      
   eyeNum →2      
p1---------------------------    
  第二个Person对象  第一个Person对象   
p2------ name →"B" name →"A"  
          
栈内存      

 

 

画的很难看,不过大概就是上面这样。

 

欢迎大家访问我的个人网站 萌萌的IT人
Java 中局部变量没有默认初始化值,而成员变量有默认初始化值,主要有以下几个方面的原因: ### 技术层面 从技术角度来看,局部变量通常总量大且生命周期短。局部变量存在于线程的栈(Stack)中,虽然栈可以辅助进行初始化,但如果 JVM 对大量短生命周期的局部变量进行初始化,会带来较大的开销。而成员变量初始化在 JVM 加载阶段完成,JVM 会在不同阶段对静态和非静态成员变量进行初始化,这种集中的初始化方式相对高效。静态成员变量在“准备”阶段先附默认值,在“初始化”阶段再根据代码赋值;非静态成员变量在“初始化”阶段根据代码赋值情况进行处理,没有赋值则赋默认值。数据分别存放在方法区(静态成员变量)和 Java 堆(非静态成员变量)中,这种机制使得成员变量初始化管理更为合理[^2][^4]。 ### 业务层面 局部变量一般用于实际问题的运算,在具体的业务逻辑中,程序员通常会根据实际需求为局部变量赋予有意义的值,很少会用到默认值,所以为局部变量赋默认值的意义不大。而成员变量代表了的属性,在很多情况下需要有一个初始状态,默认初始化值可以保证对象在创建时成员变量有一个合理的初始值,方便后续使用[^2][^4]。 ### 编程思想层面 未初始化的局部变量更有可能是程序员的疏忽,如果编译器为局部变量附默认值,可能会掩盖这种失误。强制程序员为局部变量提供初始值,有助于在开发过程中发现程序里的缺陷。而成员变量有默认初始化值可以保证对象在创建后成员变量处于一个已知的初始状态,避免因成员变量初始化而导致的潜在错误[^2][^4]。 以下是一个示例代码,展示成员变量和局部变量的初始化情况: ```java public class VariableInitializationExample { // 成员变量,有默认初始化值 static int staticMemberVariable; int nonStaticMemberVariable; public void exampleMethod() { // 局部变量,没有默认初始化值,必须手动赋值 // int localVariable; // 编译错误,使用未初始化的局部变量 int localVariable = 10; System.out.println("局部变量的值: " + localVariable); } public static void main(String[] args) { VariableInitializationExample example = new VariableInitializationExample(); System.out.println("静态成员变量的默认值: " + staticMemberVariable); System.out.println("非静态成员变量的默认值: " + example.nonStaticMemberVariable); example.exampleMethod(); } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值