局部变量和成员变量的区别分为五点
-
定义的位置不一样【重点】
public class DemoVariableDifference { String name; //成员变量 public void methodA(){ int num = 20; //局部变量 System.out.println(num); } public void methodB(){ System.out.println(num); } } 同样的是变量,如果在方法methodB中执行打印num,直接报错 但是如果在方法methodB中执行打印name,不报错 结论: 局部变量:在方法的内部 成员变量:在方法外部,直接写在类当中
-
作用范围不一样【重点】
public class DemoVariableDifference { String name; //成员变量 public void methodA(){ int num = 20; //局部变量 System.out.println(num); System.out.println(name); } public void methodB(){ System.out.println(num); //错误写法 System.out.println(name); } } 同样的是变量,如果在方法methodB中执行打印num,直接报错 但是如果在方法methodB中执行打印name,不报错 结论: 局部变量:只有在方法当中才可以使用,出了方法就不能再使用了 成员变量:整个类全部可以通用
-
默认值不一样【重点】
public class DemoVariableDifference { String name; //成员变量 (默认值是null) public void methodB(){ int age; System.out.println(age); //报错,age没有默认值,没有被赋值的局部变量不能使用 System.out.println(name); } } 同样是变量,如果在方法methodB中执行打印age,直接报错 但是如果在方法methodB中执行打印name,不报错 结论: 局部变量:没有默认值,如果想要使用,必须手动进行赋值 成员变量:如果没有赋值,会有默认值,规则和数组一样 补充一点: public void methodC(int size){ //方法的参数同样是局部变量,为什么输出不报错呢? //参数被方法调用的时候,必然会被赋值的,因为需要传参。 System.out.println(size);
}
-
内存的位置不一样【了解】
局部变量:栈内存中(局部变量是跟着方法走的) 成员变量:堆内存中 (因为需要new,所以存在于堆中)
-
生命周期不一样
局部变量:随着方法进栈而诞生,随着方法出栈而消失 成员变量:随着对象的创建而诞生,随着对象被垃圾回收(CG)而消失, 最后需要注意的是,CG是不可控的(程序员无法控制何时回收)