一、Java中的所有变量可以分成局部变量和成员变量。他们的区别:
1. 定义
成员变量:在类体里面定义的变量称为成员变量;
局部变量:形参、方法、代码块中定义的变量,都属于局部变量。
(注:局部变量定义必须在方法里面!)
2. 详细分类
成员变量:1)类变量(静态变量)——有static修饰;
2)实例变量(非静态变量)——没有static修饰。
局部变量:1)形参——方法签名中定义的变量;
2)方法局部变量——在方法(函数)内定义;
3)代码块局部变量——在代码块内定义(例如for循环里面的变量)。
3. 初始化
成员变量:无需显式初始化,只要为一个类定义了类变量或实例变量,则系统会在这
个类的准备阶段或创建这个类的实例时进行默认初始化。
局部变量:除了形参之外,都必须显式初始化。
4. 作用范围
成员变量:作用于整个类中;
局部变量:作用于方法(函数)中,或者语句中。
5. 在内存中的位置
成员变量:在堆内存中。因为类或对象的存在,才在内存中存在;
局部变量:在栈内存中。因为他不属于任何类或实例,因此他总是保存在其所在方法
的栈内存中的。如果局部变量是基本类型的变量,则直接把这个变量的值
保存在该变量对应的内存中;如果是引用类型的变量,则这个变量存放的
是地址,通过该地址引用到该变量实际引用的对象或数组。
二、类变量和实例变量的区别:
1. 引用
类变量:可以向前引用;
实例变量:不可以向前引用,如果向前引用,则成为非法向前引用。
2. 归属及生命周期
类变量:属于类本身。可以理解为类成员变量。它作为类的一个成员,与类共存亡;
实例变量:属于类的实例对象。可以理解为实例成员变量。它作为实例的一个成员,
与实例共存亡。
3. 空间分配
类变量:不依赖类的实例,只在初始化时在栈内存中被分配一次空间。无论类的实例
被创建几次,都不再为类变量分配空间;
实例变量:在创建实例时分配内存空间
4. 存放位置
类变量:随着类的加载而存在于方法区中;
实例变量:随着对象的建立而存在于堆内存中。