成员变量
成员变量:在类中定义的变量,分为类变量(static修饰)和实例变量(没有satic修饰);
类变量作用域:从该类开始到该类结束,作用域与该类的生存范围相同(与类本身共存亡);
实例变量作用域:从该实例对象被创建开始直至该实例对象销毁,作用域与该实例对象的生存范围相同(与实例共存亡);
1、类存在,访问该类的类变量: 类.类变量 ( Person.eyeNum);
2、实例存在,访问该类的实例变量:实例.实例变量 (p.name);
3、该类实例访问类变量:实例.类变量 ( p.eyeNum)(注意:由于该实例并不拥有类变量,所以通过实例修改类变量的值时,修改的依然是类的类变量,与通过类修改类变量的结果完全相同,修改后其他实例访问该类变量时,获取的修改后的类变量的值)
eg:
class Person{
//定义一个实例变量
public String name;
//定义一个类变量
public static int eyeNum;
}
public class PersonTest{
public static void main(String[] args){
//第一次使用Person类,该类自动初始化,eyeNum变量输出为0
System.out,println("eyeNum变量值"+Person.eyeNum);
//创建Person对象
Person p = new Person();
//通过引用p访问Person对象name实例变量,通过实例访问类变量
System.out,println("p的name变量值"+p.name+"p的eyeNum变量值"+p.eyeNum);
//直接为name变量赋值
p.name = "张三";
//通过p访问eyeNum变量
p.eyeNum = "2";
//通过引用p访问Person对象name实例变量,通过实例访问类变量,p.eyeNum输出为2
System.out,println("p的name变量值"+p.name+"p的eyeNum变量值"+p.eyeNum);
Person p2 = new Person();
//通过实例p2访问类变量,p.eyeNum输出为2
System.out,println("p的name变量值"+p.name+"p的eyeNum变量值"+p.eyeNum);
}
}
注意:只要为一个类定义了类变量和实例变量,系统会在该类的初始阶段或创建该类的实例化时进行默认初始化。系统默认分配:0、false、null、"\u0000"。
局部变量
局部变量的三种形式:
1、形参:在定义方法签名时定义的变量,作用域在整个方法体内有效;初始化在调用该方法是由系统完成,形参的值由方法的调用者指定;
2、方法局部变量:在方法体内定义的局部变量,作用域从定义的地方开始生效直至该方法结束时失效;
3、代码块局部变量:在代码块内定义的局部变量,作用域从代码块内定义的地方开始生效直至该代码块结束时失效;
注:局部变量除了形参,其余都必须显式初始化(必须指定初始值,否则不可以访问它们)
eg:代码块局部变量作用域
public class BlockTest{
public static void main(String[] args){
{
//定义一个代码块局部变量
int a;
//由于a变量海未初始化,所以代码出现错误
System.out.println(a);
//为a变量赋值,即进行初始化
a = 2;
System.out.println(a);
}
//由于访问的a变量超出代码块范围,所以a变量不存在,出现错误
System.out.println(a);
}
}
eg:方法局部变量作用域
public class MethodLocalVariableTest{
public static void main(String[] args){
//定义一个方法局部变量a
int a;
//由于a变量还未进行初始化,所以不能访问
//System.out.println(a);
//为a变量进行初始化
a = 5;
System.out.println(a);
}
}
成员变量与局部变量可以同名,若方法里的局部变量与成员变量同名,则局部变量会覆盖成员变量,若想要引用被覆盖的成员变量,则使用this(对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。
public class VariableOverrideTest{
//定义一个name实例变量
private String name = "张三";
//定义一个类变量
private static double price = 10;
public static void main(){
//定义方法中的局部变量,则局部变量覆盖成员变量
int price = 15;
//直接访问price,值为15
System.out.println(price);
//使用类名作为price的限定,值为10
System.out.println(VariableOverrideTest.price);
//运行info方法
new VariableOverrideTest.info();
}
public void info(){
//定义方法里的局部变量,并覆盖成员变量
String name = "王五";
//直接访问name变量。值为王五
System.out.println(name);
//使用this作为name变量限定,值为“张三”
System.out.println(this.name);
}
}