一:概述
在面向对象一开始的学习中,对一些其中基础语法的了解和熟悉非常的重要,有助于更深入的去学习面向对象的知识。在这里具体的说明一下成员变量和局部变量的区别。
二:具体说明
<1>java中变量的分类
<2>成员变量和局部变量的定义说明。
成员变量:成员变量分为静态变量(类变量)和实例变量。静态变量有static修饰,它从该类的初始阶段就已经存在,直到这个类系统被摧毁,静态变量的作用域与这个类的生存范围相同也就是随着类的加载而加载。实例变量没有static修饰,它从该类的实例被创建时就存在,直到系统摧毁这个实例,实例变量的作用域与对应实例的生存范围相同,静态变量的作用范围较实例变量来说范围更广存活时间周期长。
静态变量和实例变量的区别:静态变量使用类名访问,不需要创建实例,
类。静态变量
而实例变量需要通过实例访问,需要先new一个实例。
实例.实例变量
具体的代码实例
public class Car {
// 静态变量
static String carName = "奥迪"; // 汽车名称
// 实例变量
double price; // 汽车的价格
}
public class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car();
Car.carName = "上汽大众";
System.out.println("汽车的名称为:" + Car.carName);
System.out.println("c1的价格:" + c1.price);
System.out.println("c2的价格:" + c2.price);
}
运行结果截图:
对上面这个代码简单说明一下,当程序第一次执行Car类时,系统先加载这个类,并初始化这个类,在类的准备阶段,系统就为该类的类变量分配内存空间,并指定默认初始值(静态变量name也是在这个阶段完成了初始化);然后接下来系统就在堆内存中为Car类分配了一块内存区,且为price默认值为0,然后生成了Car对象,并通过引用变量c2指向该对象。
当再次执行Car类时,已经不需要再为Car类初始化了,所以直接生成了Car对象,通过c2指向它。
局部变量:它有三种不同的表现形式:
- 形参:在定义方法时定义变量,形参的作用域在整个方法内有效。通常方法可以传参也可以不传参,具体看实际应用情况。
- 方法局部变量:在方法体中定义的变量,作用域从定义该变量的地方生效,到方法结束之时失效。
- 代码块局部变量:在代码块中定义的变量,作用域从定义该变量的地方生效,到该代码结束时失效,代码块可用于初始化变量。优先于类的加载。
和成员变量不同的是,局部变量除了形参之外,都需要指定一个初始值,否则就无法访问。
局部变量在内存中的运行机制。
因为局部变量需要显示初始化,所以系统不会对它进行初始画dwwcn,即系统并没有给局部变量分配内存空间,只有它赋值之后,系统才会分配内存将该值放入其中
因为局部变量不属于任何对象或者类,所以局部变量存放在栈内存中,且栈内存中的变量不需要系统垃圾回收,因为它们会随着方法或者代码运行结束而结束;所以局部变量只保存基本类型或者对象的引用(引用变量),所以
局部变量占用内存比较小;
注意:java语法允许局部变量和成员变量重名,但是如果在一个方法里,局部变量会覆盖成员变量。如果想要在该方法中访问成员变量,需要通过**this关键字(针对实例变量)去调用或者类名(针对静态变量),**作为调用者来限定访问成员。this关键在的作用就是区分成员变量和局部变量,使用的原则是,谁离它进就用谁。
具体代码说明:
public class CarTest2 {
// 静态变量 类变量
static String carName = "奥迪"; // 汽车名称
// 实例变量
double price = 500000; // 汽车的价格
public static void main(String[] args) {
// 局部变量 和静态变量carName = “奥迪”重名
String carName = "劳斯莱斯";
// 静态变量carName被这里的局部变量所覆盖,所以输出劳斯莱斯
System.out.println("汽车的名字:" + carName);
// 这时候如果想要调用静态变量可以使用类名.变量名去调用
// 在这里不能使用this去调用,因为main方法是静态方法
System.out.println("汽车名称:" + CarTest2.carName);
// 调用方法
new CarTest2().check();
}
public void check() {
// 局部变量 和实例变量price = "500000"重名
double price = 600000;
// 因为实例变量carName被这里的局部变量覆盖,所以输出为“600000”
System.out.println("汽车的价格为:" + price);
// 这时候如果想要调用实例变量可以使用this调用
System.out.println("汽车价格为:" + this.price);
}
}
运行结果截图:
<3>成员变量和局部变量的区别
- 类中位置不同:**成员变量(类中方法外)局部变量(方法内部或方法声明上)
- 内存中位置不同:**成员变量(堆内存)局部变量(栈内存)
- 生命周期不同:**成员变量(随着对象的存在而存在,随着对象的消失而消失)局部变量(随着方法的调用而存在,醉着方法的调用完毕而消失)
- 初始化值不同:**成员变量(有默认初始化值)局部变量(没有默认初始化值,必须先定义,赋值才能使用)