java变量的初始化和属性的默认值问题。为什么local variables 使用时要赋初值,而global variables 系统默认初值?
"成员变量是对象的一个属性,是随着对象的创建而分配空间,并经过JVM初始化" 貌似不太对啊。
public class A {
String ss;
}
public void static main() {
A a = new A();
a.ss; //这里是个null,jvm可没有为ss分配任何内存空间哦
}
这个人的问题就有问题,不论是全局变量还是局部变量,都是需要初始化的。你可以不初始化,对于一个没有初始化的non-primitive类型变量来说,它的默认值是null;而对于一个primitive类型的变量来说,采用其默认值,比如int型的就是0,boolean型的就是false。
我可能对问题理解的不透彻,还请指教。
首先要知道,局部变量一般分配在栈上面(值不一定分配在栈上面,比如引用类型的可能是分配在堆上面,也可能分配在常量区),而对象是分配在堆上面的。
java是面向对象的语言,对象一般分配在堆上面,成员变量是对象的一个属性,是随着对象的创建而分配空间,并经过JVM初始化,那么为什么jvm会为堆上的对象的属性初始化呢,试想一下,现实世界中,一般一个人有胳膊有腿,到了JVM里面,你new出一个人来,结果缺胳膊少腿的,肯定不行。所以JVM会为成员变量进行初始化,完了在运行时,你还可以去改变。
那么局部变量为什么不会初始化呢?声明一个局部变量 Person person变量,为什么一定要初始化才能用呢?JVM为什么不先帮我初始化一下呢?我估摸着JVM是考虑资源的问题,因为大家在使用局部变量的时候,一般想这个局部变量来存储我们想要储存的值,一般不会拿null之类的来做业务逻辑处理吧。所以JVM认为你应该自己指定一个值,然后来使用它。所以他就不帮我们初始化局部变量了,如果他初始化了局部变量,但通常又不是我们想要的,在局部变量为引用类型的时候,值是分配在堆上面或常量区里面,初始化了就占了内存,你又不用,JVM一时半会儿也不回收,不是浪费资源么?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。