成员变量被分为类变量和实例变量两种。
由于实例并不拥有类变量,因此它访问的并不是这个实例的变量,依然访问的是它所对应的类变量。也就是说,如果通过一个实例修改了类变量的值,由于这个类变量并不属于它,而是属于它所对应的类。因此,修改的依然是类的类变量,与通过该类来修改类变量的结果完全相同。
package chap5_3;
class Person
{
public String name;
public static int eyeNum;
}
public class PersonTest {
public static void main(String[] args)
{
System.out.println("Person的eyeNum类变量值:"+Person.eyeNum);
Person p=new Person();
System.out.println("p变量的name变量值:"+p.name+"p对象的eyeNum变量值:"+p.eyeNum);
p.name="孙悟空";
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对象的eyeNum类变量值:"+p2.eyeNum);
}
}
运行结果
Person的eyeNum类变量值:0
p变量的name变量值:nullp对象的eyeNum变量值:0
p变量的name变量值:孙悟空p对象的eyeNum变量值:2
Person的eyeNum类变量值:2
p2对象的eyeNum类变量值:2
实例也可以访问类变量,同一个类的所有实例访问类变量时,实际上访问的是该类本身的同一个变量,也就是说,访问了同一片内存区。
局部变量根据定义形式的不同,又可以被分为:形参、方法局部变量、代码块局部变量。
package chap5_3;
public class BlockTest {
public static void main(String[] args) {
{
int a;
// System.out.println("代码块局部变量a的值:"+a);
a = 5;
System.out.println("代码块局部变量a的值:" + a);
}
//System.out.println(a);
}
}
运行结果
代码块局部变量a的值:5
package chap5_3;
public class MethodLocalVariableTest {
public static void main(String[] args)
{
int a;
// System.out.println("方法局部变量的值:"+a);
a=5;
System.out.println("方法局部变量的值:"+a);
}
}
方法局部变量的值:5
形参的作用域是整个方法体内有效,而且形参也无须显式初始化,形参的值由方法的调用者负责指定。
如果方法里的局部变量和成员变量同名,局部变量会覆盖成员变量,如果需要在这个方法里引用被覆盖掉的成员变量,则可使用this(对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。
package chap5_3;
public class VariableOverrideTest {
private String name="李刚";
private static double price=78.0;
public static void main(String[] args)
{
int price=65;
System.out.println(price);
System.out.println(new VariableOverrideTest().price);
new VariableOverrideTest().info();
}
public void info()
{
String name="孙悟空";
System.out.println(name);
System.out.println(this.name);
}
}
运行结果
65
78.0
孙悟空
李刚