成员变量指的是类范围里定义的变量,也就是前面所说的属性;局部变量是指一个方法内定义的变量。
成员变量被分为类属性和实例属性两种,定义一个属性时不使用static修饰的就是实例属性,使用
static修饰就是类属性。其中类属性从这个类的准备阶段起开始存在,直到系统完全销毁这个类,
类属性的作用域与这个类的生存范围相同;而实例属性则从这个类的实例被创建开始起存在,直到系统
完全销毁这个实例,实例属性的作用域与对应实例的生存范围相同。
<span style="font-size:18px;">package Agu3th;
public class Person {
public String name;
public static int eyeNum;
}
package Agu3th;
public class TestPerson {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Person类已经初始化了,则eyeNum变量起作用了,输出0
System.out.println("Person的eyeNum类属性值:"+Person.eyeNum);
Person p= new Person();
System.out.println("p变量的name属性值是:"+p.name+",p对象的eyeNum属性值是:"+p.eyeNum);
p.name = "sunwukong";
p.eyeNum = 2;
System.out.println("p变量的name属性值是:"+p.name+",p对象的eyeNum属性值是:"+p.eyeNum);
System.out.println("Person的eyeNum类属性值:"+Person.eyeNum);
Person p2 = new Person();
System.out.println("p2变量的name属性值是:"+p2.name+",p2对象的eyeNum类属性值是:"+p2.eyeNum);
}
}</span>
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">如果通过一个实例修改了类属性的值,由于这个雷属性并不属于他,而是属于他对应的类,因此,修改的依然是类的属性,并不是变量的属性,与通过该类
来修改类属性的结果完全一致,这会导致该类的其他实例来访问这个类属性时也将获得这个被修改过的值。
局部变量根据定义形式的不同可以分成三种:
1 形参: 在定义方法签名时定义的变量,形参的作用域在整个方法内有效。
2 方法局部变量:在方法体内定义的局部变量,他的作用域是从定义该变量的地方生效,到该方法结束时失效。
3代码块局部变量:在代码块中定义的局部变量,这个局部变量的作用域从定义该变量的地方生效,到该代码块结束时失效。
与成员变量不同的是,局部变量除了形参之外,都必须显示初始化。就是说,必须先给方法局部变量和代码块局部变量指定初始值,否则不可以访问他们。</span>
</span></span>
<span style="font-size:18px;">package Agu3th;
public class TestBlock {
public static void main(String[] args) {
{
int a;
// System.out.println("代码块局部变量a的值:"+a);//The local variable a may not have been initialized
a = 5;
System.out.println("代码块局部变量a的值:"+a);
}
// System.out.println(a);a cannot be resolved to a variable
}
}</span>
只要离开了代码块局部变量所在的代码块,则这个局部变量立即被销毁。
在同一个类里,成员变量的作用范围是整个类内有效,一个类里不能定义两个同名的成员变量,即使一个是类属性,一个是实例属性也不行;一个方法里
不能定义两个同名的局部变量,即使一个是方法局部变量,一个是代码局部变量或者形参也不行。
<span style="font-size:18px;">package Agu3th;
public class TestVariableOverride {
private String name = "ligang";
private static double price =78.0;
public void info()
{
String name = "sunwukong";
System.out.println(name);
System.out.println("*********"+this.name);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int price = 65;
System.out.println(price);
System.out.println(TestVariableOverride.price+"************");
new TestVariableOverride().info();
}
}
运行结果:
65
78.0************
sunwukong
*********ligang</span>
java允许局部变量和成员变量同名,如果方法里的局部变量和成员变量同名,局部变量会覆盖成员变量,如果需要在这个方法里引用被覆盖的成员变量,
则可以使用this(对于实例属性)或者类名(对于类属性)作为调用者来限定访问成员变量。
如下几种情形,则应该考虑使用成员变量:
1 如果需要定义的变量是用于描述某个类或者对象的固有信息,例如人的身高,体重等,他们是人对象的固有信息,每个人都有这些信息。这种变量定义为
成员变量。如果这种信息对这个类的所有实例完全相同,或者说他是类相关,如果人类的眼睛,这种类相关的信息应该用类属性;
2 如果在某个类中需要以一个变量来保存该类或者实例运行时的状态信息,这种勇于保存某各类,或者某个实例的状态信息的变量通常应该使用成员变量。
3如果某个信息需要在某个类的多个方法之间进行共享,则这个信息应该使用成员变量来保存。