1. 定义方式
- 静态变量:在定义时需要在变量名前加上
static
关键字。静态变量也称为类变量,因为它属于类本身,而不是类的某个特定实例。 - 实例变量:在定义时不需要加
static
关键字。实例变量属于类的实例(对象),每个对象都有自己独立的实例变量副本。
2. 初始化时机
- 静态变量:随着类的加载而初始化。这意味着,当类被JVM(Java虚拟机)加载到内存中时,静态变量就会被分配空间并初始化(如果指定了初始值)。
- 实例变量:在创建类的实例(即对象)时初始化。每当使用
new
关键字创建类的实例时,都会为实例变量分配空间并初始化(如果指定了初始值或构造函数中进行了初始化)。
3. 内存位置
- 静态变量:存储在静态变量区(也称为方法区或永久代,但在现代JVM中可能有所不同,如Java 8及以后版本中的元空间)。这些变量在类的整个生命周期内都存在,且所有实例共享同一份静态变量。
- 实例变量:存储在堆内存区。每个对象都有自己独立的实例变量副本,这些变量随着对象的创建而分配空间,随着对象的销毁而失去引用,最终等待垃圾回收。
4. 调用方式
- 静态变量:可以通过类名直接访问,无需创建类的实例。例如,如果有一个名为
MyClass
的类,其中有一个静态变量staticVar
,则可以通过MyClass.staticVar
来访问它。 - 实例变量:必须通过类的实例(对象)来访问。例如,如果有一个名为
MyClass
的类,其中有一个实例变量instanceVar
,则必须先创建MyClass
的实例,然后通过该实例来访问instanceVar
,如MyClass obj = new MyClass(); obj.instanceVar
。
5. 生命周期
- 静态变量:随着类的加载而加载,直到JVM停止运行时才销毁。静态变量的生命周期与类的生命周期相同。
- 实例变量:随着对象的创建而产生,随着对象的销毁而失去引用,最终等待垃圾回收。实例变量的生命周期与对象的生命周期相同。
综上所述,静态变量和实例变量在定义方式、初始化时机、内存位置、调用方式和生命周期等方面都存在显著差异。了解这些差异对于编写高效、可维护的Java代码至关重要。