成员变量:写在类声明的大括号里面的变量。
如果在变量有static关键字修饰,就叫作静态变量或类变量;
如果该变量没有static关键字修饰,就叫作非静态变量或实例变量;
class A {
int a ;
}
局部变量:方法内定义的变量、形参、代码块中定义的变量.
局部变量除形参之外,都必须显示初始化,就是必须先给方法局部变量和代码块局部变量指定初始值,否则不可以访问它们。
public void test(int a){
a = 1;
}
两者的区别
一、初始值不同:
成员变量声明了就可以使用,有默认值;局部变量必须经过声明和赋值操作才能使用,并且没有默认值。
成员变量的默认值:
int类型的默认值是0
String类型的默认值是null
double类型的默认值是0.0d
Integer类型的默认值是null
Long类型的默认值是null
long类型的默认值是0L
float类型的默认值是0.0f
char类型的默认值是\u0000
byte类型的默认值是(byte)0
short类型的默认值是(short)0
二、存储位置不同:
成员变量分配到堆中,成员变量的作用于在整个内部都是可见的,所有成员方法都可以使用它。如果访问权限允许,还可以在类的外部使用成员变量。
局部变量分配到栈中,局部变量的作用于仅限于定义它的方法,在该方法的外部无法访问。
三、生命周期不同:
成员变量随着对象的存在而存在,随着对象的销毁而销毁;局部变量随着方法的存在而存在调用,销毁而销毁;局部变量只能在声明它的方法中使用,而成员变量在整个类中都可以使用。
四、优先级:
成员变量和局部变量同名时,局部变量的赋值具有更高的优先级,优先取局部变量的值。
五、可否同名:
在同一个方法中,可以有同名的局部变量;
在不同的方法中,可以有同名的局部变量。
六、修饰符:
成员变量可以被public,protect,private,static等修饰符修饰;
局部变量不能被控制修饰符及static修饰;
两者都可以定义成final型。
小结:
同一个类里,成员变量的作用范围是整个类内,一个类里不能定义两个同名的成员变量,即使一个是类变量,一个是实例变量也不行;一个方法里不能定义两个同名的方法局部变量,方法局部变量与形参也不能同名;同一个方法中不同代码块内的代码块局部变量可以同名;如果先定义代码块局部变量,后定义方法局部变量,前面定义的代码块局部变量与后面定义的方法局部变量也可以同名。
java允许局部变量和成员变量同名,如果方法里的成员变量和局部变量同名,局部变量会覆盖成员变量,如果需要在这个方法里引用被覆盖的成员变量,则可以使用this(对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。