返回信息流小白最近在看java基础,有一个疑问,在C++里面,类定义的时候普通成员变量不赋初值,不分配内存。但是java中普通成员变量就可以赋予初值,那么类定义的时候就存在内存分配吗?
这是一条镜像帖。来源:北邮人论坛 / java / #62690同步于 2019/9/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求助:关于JAVA类成员变量初始化的一个问题
CrazyBear
2019/9/19镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 Chenrjabc 的大作中提到: 】
: 类定义的时候不会内存分配,这只是初始化的问题 只有new出来了才开始内存分配
嗯嗯,正打算结合着JVM那本书理解一下
Java编程思想已经看完了?如果看完了,不会问这样的问题吧
【 在 CrazyBear (晴空下的飞鱼) 的大作中提到: 】
: 嗯嗯,正打算结合着JVM那本书理解一下
【 在 Chenrjabc 的大作中提到: 】
: Java编程思想已经看完了?如果看完了,不会问这样的问题吧
都说了小白, 我想遇到问题的时候把问题解决了,而不是把所有的东西全看透了再回头想这些问题。
建议补充类加载过程知识以及初始化过程还有对象实例化过程知识。
类加载当中初始化过程会将一些静态变量分配内存并且赋予初始0值,之后还有为对象分配内存,内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。然后在一般你遇到的new对象后会进行init操作,按程序意愿将那些0值都改变为真实值。
jvm类加载准备阶段 只会为类变量(static修饰)分配内存 分配的是零值 不会为类成员变量分配内存 而final修饰的常量就直接赋给想要的值 不知道对不对
没记错的话,普通成员变量在新建对象后,会 invoke <init>,变量初始化就在这里完成。在执行 <init> 之前是默认 0 值,<init> 之后就是指定的初始化值,JVM 里有提到。