大家好,这里是白子茶,这节我们来讲解,成员变量和局部变量。
首先,变量有多少种,如何区分?
我们可以从两个角度来理解变量的分类:
角度1:按照数据类型来分:基本数据类型、引用数据类型。
角度2:按照变量在类中声明的位置的不同:成员变量(或属性、域)、局部变量。
其中,局部变量一般声明在方法内、构造器内、方法形参、构造器形参、代码块内等。
成员变量声明在方法体外,类体内。
局部变量声明在方法体内。
举个例子:
public class Person {
String name;
int age;
char gender;
public void eat(){
String food = "宫保鸡丁";
System.out.println("我喜欢吃" + food);
}
public void sleep(int hour){
System.out.println("人不能少于" + hour + "小时的睡眠");
System.out.println("name = " + name);
}
}
你能分清哪些是成员变量,哪些是局部变量吗?
其中,name\age\gender是成员变量。
food\hour皆为局部变量。
如何区分的呢?
按照本文开头所说的,方法体内为局部变量,方法体外类体内为成员变量。
所以,其中name、age、gender不在方法之内但是在类体内,所以是成员变量。
food、hour在方法体内,所以是局部变量。
如何彻彻底底的区分成员变量给和局部变量呢?
接下来,就是重头戏了。
首先谈相同点。
相同点:
1.变量声明的格式相同:数据类型 变量名 = 变量值
2.变量都有有效的作用域,出了作用域就会失效。
3.变量都必须先声明、后赋值、再使用。
不同点:
①首先是声明的位置不同:
成员变量:声明在类内,方法之外的变量。
局部变量:声明在方法内的变量。
②在内存中分配的位置不同:
成员变量:随着对象的创建,存放在堆空间里面。
局部变量:存放在栈空间里面。
③生命周期:
成员变量:随着对象的创建而创建,随着对象的消亡而消亡。
局部变量:随着方法对应的栈入栈,局部变量会在栈中分配;随着方法对应的栈帧出栈,局部变量消亡。
④作用域:
成员变量:整个类的内部中都是有效的。
局部变量:仅限于声明此局部变量的方法(或构造器、代码块)内。
⑤是否有权限修饰符的修饰:
成员变量:可以。
局部变量:不可。
⑥默认值:
成员变量:有默认值。
局部变量:没有默认值,使用之前,必须赋值,否则报错。
注意:对于方法的形参而言,调用此方法时,赋值即可。
最后呢,我们来一道测试题。
public class Employee {
int id;
String name;
int age;
double salary;
}
我们呢,先声明了Employee类,并且声明了属性(成员变量)。
public class EmployeeTest {
public static void main(String[] args) {
Employee p1 = new Employee();
Employee p2 = new Employee();
System.out.println(p1);
}
}
我们此时声明了测试类,并且创建了两个对象,但是我们并未赋值。
此时,我们打印P1,会发生什么呢?
xxx.Employee@b4c966a
是一个地址值!对的,我们p1指向了堆空间,我们打印就是地址值,如果我们写p1.age,会发生什么呢?默认值?YES!
public class EmployeeTest {
public static void main(String[] args) {
Employee p1 = new Employee();
Employee p2 = new Employee();
p1.name = "TOM";
p1.age = 24;
p1.id = 1;
p1.salary = 6000;
System.out.println("name = " + p1.name + ", age = " + p1.age + ", id = " + p1.id
+ ", salary = " + p1.salary);
}
}
随后我们进行赋值,就打印出了员工的正常信息。
name = TOM, age = 24, id = 1, salary = 6000.0
至于p2,就由读者们自己赋值去打印吧!