Java成员变量和局部变量初始化问题
2017-09-15 20:51
302 查看
转自:https://www.zhihu.com/question/30516949
成员变量可以不用初始化,其具有默认值;但是局部变量一定需要初始化或者赋值后才能使用,否则编译报错。
[java] view
plain copy
print?
public class Demo {
int m;
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println(demo.m); //输出0
}
}
public class Demo {
public static void main(String[] args) {
int m;
System.out.println(m); //报未初始化错误
}
}
首先 Java 语言就是这么规定的。
然后为什么 Java 语言要这么规定呢?有什么内部机理吗?
可能的原因如下,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化,方便快捷。
而对于方法的局部变量,是在线程的Stack中,当然Stack他也可以帮我们初始化,不过有一个问题。对于有些局部变量,在方法的一开始是没有的,有些在循环中的局部变量是要反复的声明多次的。有些局部变量作用域结束后,另一个局部变量又会占用这个局部变量的位置。
那么初始化要放在何时呢?当然JVM可以帮我们初始化多次,不过那样或许会带来性能问题。
[java] view
plain copy
print?
for (int i = 0; i < 10; i++) {
int n;
if (i % 2 == 0) {
n = 10;
} else {
n = 20;
}
}
像是这个n,我们完全不用JVM帮我们初始化,如果每次循环他都帮我们初始化一次,那么是没有必要的。综上所述,对于局部变量,可能不帮我们初始化是一个不错的选择。(而且JVM实现起来也更容易!!!)
成员变量可以不用初始化,其具有默认值;但是局部变量一定需要初始化或者赋值后才能使用,否则编译报错。
[java] view
plain copy
print?
public class Demo {
int m;
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println(demo.m); //输出0
}
}
public class Demo {
public static void main(String[] args) {
int m;
System.out.println(m); //报未初始化错误
}
}
首先 Java 语言就是这么规定的。
然后为什么 Java 语言要这么规定呢?有什么内部机理吗?
可能的原因如下,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化,方便快捷。
而对于方法的局部变量,是在线程的Stack中,当然Stack他也可以帮我们初始化,不过有一个问题。对于有些局部变量,在方法的一开始是没有的,有些在循环中的局部变量是要反复的声明多次的。有些局部变量作用域结束后,另一个局部变量又会占用这个局部变量的位置。
那么初始化要放在何时呢?当然JVM可以帮我们初始化多次,不过那样或许会带来性能问题。
[java] view
plain copy
print?
for (int i = 0; i < 10; i++) {
int n;
if (i % 2 == 0) {
n = 10;
} else {
n = 20;
}
}
像是这个n,我们完全不用JVM帮我们初始化,如果每次循环他都帮我们初始化一次,那么是没有必要的。综上所述,对于局部变量,可能不帮我们初始化是一个不错的选择。(而且JVM实现起来也更容易!!!)
相关文章推荐
- java中成员变量和局部变量的初始化
- 关于java中成员变量有默认初始化而局部变量没有
- Java中成员变量和构造方法谁先初始化的问题
- 7 面向对象(成员变量和局部变量的区别,类作为形式参数的问题,匿名对象,封装,private关键字,this关键字,构造方法,类的初始化过程,static关键字)
- java线程安全问题之静态成员变量、实例成员变量、局部变量
- java开发转php遇到的问题-- 初始化成员变量报错问题
- java成员变量和局部变量的初始化和内存中的运行机制
- java线程安全问题之静态成员变量、实例成员变量、局部变量
- java基础---静态变量,成员变量,局部变量及类的初始化顺序
- 关于成员变量和局部变量是否都会被默认初始化的问题
- java线程安全问题之静态成员变量、实例成员变量、局部变量
- java线程安全问题之静态成员变量、实例成员变量、局部变量
- java中一个值得注意的问题---类成员初始化与变量初始化的区别
- java关于局部变量必须初始化赋初值及成员变量不必须该操作的原理浅解析
- java 中的 成员变量、局部变量、静态变量、类变量、非静态变量、实例变量、向前引用、非法向前引用、静态代码块、非静态代码块 执行时机
- (已解决一部分)哪位对类的构造函数内的成员变量的初始化过程比较熟悉~帮忙看个问题
- java 线程---成员变量与局部变量
- [ java ] 变量的初始化问题!
- java中的变量初始化问题
- 特殊成员变量初始化问题