Java中static修饰成员变量的教程
在Java中,成员变量按照是否使用static
关键字修饰,可以分为类变量(静态变量)和实例变量。这两种变量在定义、使用以及存储位置上有显著的区别。
1. 类变量(静态变量)
-
定义:使用
static
关键字修饰的成员变量。 - 存储位置:存储在方法区(静态区),在类加载时创建,只有一份,被类的所有实例共享。
-
访问方式:可以通过类名直接访问,也可以通过实例对象访问(但不推荐),格式为
类名.静态变量
。
2. 实例变量
-
定义:没有使用
static
关键字修饰的成员变量。 - 存储位置:存储在堆内存中,每一个对象都有自己的一份实例变量。
-
访问方式:只能通过实例对象访问,格式为
对象.实例变量
。
代码示例及注释
以下是一个详细的代码示例,展示了如何定义和使用静态变量与实例变量:
public class VariableExample {
// 静态变量(类变量),属于类,在内存中只有一份
static int staticVar = 10;
// 实例变量,属于对象,每一个对象都有一份
int instanceVar = 20;
public static void main(String[] args) {
// 通过类名访问静态变量
System.out.println("通过类名访问静态变量: " + VariableExample.staticVar);
// 创建第一个对象
VariableExample obj1 = new VariableExample();
// 通过对象访问实例变量
System.out.println("通过对象1访问实例变量: " + obj1.instanceVar);
// 修改对象1的实例变量
obj1.instanceVar = 30;
System.out.println("修改后,通过对象1访问实例变量: " + obj1.instanceVar);
// 创建第二个对象
VariableExample obj2 = new VariableExample();
// 通过对象2访问实例变量(注意:此时实例变量与obj1不同)
System.out.println("通过对象2访问实例变量: " + obj2.instanceVar);
// 通过对象访问静态变量(不推荐,但合法)
System.out.println("通过对象1访问静态变量: " + obj1.staticVar);
// 修改静态变量
VariableExample.staticVar = 40;
// 由于静态变量在内存中只有一份,所以所有对象共享同一份值
System.out.println("修改后,通过对象2访问静态变量: " + obj2.staticVar);
}
}
输出结果
通过类名访问静态变量: 10
通过对象1访问实例变量: 20
修改后,通过对象1访问实例变量: 30
通过对象2访问实例变量: 20
通过对象1访问静态变量: 10
修改后,通过对象2访问静态变量: 40
内存原理
- 静态变量:存储在方法区(静态区),在类加载时创建,且只有一份,被类的所有实例共享。
- 实例变量:存储在堆内存中,每创建一个对象,就会为该对象分配一份实例变量的存储空间。
总结
- 类变量(静态变量):属于类,在内存中只有一份,用类名调用。
- 实例变量:属于对象,每一个对象都有一份,用对象调用。
通过理解这两种变量的区别,可以更好地设计Java程序,提高程序的效率和可读性。