举例:
public class Test {
int a,b=10; //全局变量
public static void main(String[] args) {
// int c,d=10; //局部变量
// System.out.println(c+" "+d); //错误。未初始化
Test t = new Test();
System.out.println(t.a+" "+t.b); //分别输出0,10
}
}
https://www.zhihu.com/question/30516949 引入内存分析理解这个问题。
1.作者:Intopass:
首先 Java 语言就是这么规定的。然后为什么 Java 语言要这么规定呢?有什么内部机理吗?可能的原因如下,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化,方便快捷。而对于方法的局部变量,是在线程的Stack中,当然Stack他也可以帮我们初始化,不过有一个问题。对于有些局部变量,在方法的一开始是没有的,有些在循环中的局部变量是要反复的声明多次的。有些局部变量作用域结束后,另一个局部变量又会占用这个局部变量的位置。那么初始化要放在何时呢?当然JVM可以帮我们初始化多次,不过那样或许会带来性能问题。
for (int i = 0; i < 10; i++) {
int n;
if (i % 2 == 0) {
n = 10;
} else {
n = 20;
}
}
像是这个n,我们完全不用JVM帮我们初始化,如果每次循环他都帮我们初始化一次,那么是没有必要的。综上所述,对于局部变量,可能不帮我们初始化是一个不错的选择。(而且JVM实现起来也更容易!!!)
“全局变量无须初始化,局部变量必须初始化?”全局变量不是“无须”初始化,而是说,所有变量,不论局部还是全局,在“使用之前”都需要初始化。System.out.println(demo.m); //输出0 这里demo.m其实是已经初始化过了的,类的成员都有个默认值,在new一个类对象的时候自动赋值,boolean对应false,数字型的都是0,对象类型的都是null。接下来全局和局部只是作用域上的差异了。