成员变量:是指在类中定义的变量。
局部变量:是指在方法中定义的变量。
成员变量可以细分为类变量和实例变量
- 类变量:有static修饰。随着该类的准备阶段开始存在,直到系统完全销毁这个类,类变量的作用域与这个类的生存范围相同。
- 实例变量:没有static修饰。从该类的实例被创建开始存在,知道系统完全销毁这个实例。示例变量的作用域与对应实例的生存范围相同。
-
class Car{ //定义一个实例变量 车的品牌 public String brand; //定义一个类变量 发动机的数量 public static int engineNum; } public class CarTest{ private static int engineNum; private String brand; public static void main(String[] args){ //第一次加载Car类,该类初始化,static修饰的类变量同样开始初始化,值为0 System.out.println("Car的engineNum变量值为:"+Car.engineNum); //创建Car对象 Car c=new Car(); //通过Car对象的引用car来访问Car对象brand的实例变量 //通过实例访问engineNum类变量 System.out.println("car变量的brand变量值是:"+c.brand); System.out.println("Car的engineNum变量值为:"+c.engineNum); //给brand实例变量赋值 c.brand="奥迪"; System.out.println("car变量的brand变量值是:"+c.brand);//此处将输出奥迪 c.engineNum=2;//将类变量赋值 System.out.println("Car的engineNum变量值为:"+c.engineNum);//此处将输出2 //创建一个新的实例对象 Car c2=new Car(); //由于brand为实例变量,新建了实例之后需要重新赋值,所以输出为null System.out.println("car变量的brand变量值是:"+c2.brand); //由于c2访问的类变量依旧需要引用Car类,所以此处输出值仍然为2 System.out.println("Car的engineNum变量值为:"+c.engineNum); } }
局部变量根据定义形式的不同可以分为如下三种
- 形参:在定义方法签名时定义的变量,形参的作用域在整个方法里有效。
- 方法局部变量:在方法体内定义的局部变量,它的作用域是从定义该变量的地方生效,到该方法结束时失效。
- 代码快局部变量:在代码快中定义的局部变量,它的作用域是从定义该变量的地方生效,到该代码块结束时失效。
public class Demotest{
public static void main(String[] args){
{
//定义一个数字a并将其赋值
int a=1;
//输出到控制台,打印结果:2
System.out.println(a);
}
//由于a是定义在语句块里的,这里超出了它的作用域,所以会找不到a
// System.out.println(a);
}
}
PS:
方法签名=方法名+参数列表
如果一个参数列表不同,包括如下不同:
- 参数的类型不同
- 参数的个数不同
- 参数的类型的顺序不同
在同一个类里,成员变量的作用范围对整个类有效,一个类里不能定义两个同名的成员变量(一个类变量一个实例变量也不行),一个方法里不能定义两个同名的方法局部变量,方法局部变量和形参也不能同名。但是同一个方法中不同代码块内的代码块局部变量是可以同名的,如果先定义代码块的局部变量,后定义方法局部变量,这两个变量也可以同名。
Java允许局部变量和成员变量同名,如果方法里的局部变量和成员变量同名,局部变量会覆盖成员变量,如果需要调用方法里引用被覆盖的成员变量,可以使用this或者类名作为调用者来限定访问成员变量。
public class Demo1{
//定义一个name的实例变量
private String name="唐蹦桶";
//定义一个age的类变量
private static int age=23;
public static void main (String[] args){
//方法里的局部变量,如果和成员变量同名,将覆盖
int age=18;
System.out.println(age);//输出18
//使用类名定义的变量,其值还是成员变量的值
System.out.println(Demo1.age);//输出23
//运行info方法
new Demo1().info();
}
public void info(){
String name="哆啦A梦";
//直接输出name,输出结果是被局部变量覆盖的name:哆啦A梦
System.out.println(name);
//使用this定义该变量,其值还是成员变量的值,效果和使用类名定义变量一样
System.out.println(this.name);//输出:唐蹦桶
}