Java static 详解:静态变量、方法、代码块与实战示例
在 Java 中,static 关键字出现在三个不同场景:静态变量、静态方法 和 静态代码块。每种在类及其实例的生命周期中扮演独特角色。
Java 静态变量
静态变量是类级别的字段,类首次加载时仅初始化一次。与实例变量不同,所有该类对象共享同一份静态变量副本。
- 仅存在一份副本,为所有实例共享。
- 可直接通过
类名.变量名访问,无需创建对象。 - 在任何实例字段初始化前完成初始化。
语法:
public static int count;
Java 静态方法
静态方法属于类而非特定实例。无需创建对象即可调用,且只能访问静态数据。
- 可调用其他静态方法,但不能调用实例方法。
- 通过
类名.方法名()调用。 - 不能使用
this或super,因为它们不绑定实例。
所有 main 方法均为 static,以便 JVM 在对象存在前启动应用。
实战示例:使用静态变量和方法
下面的简单程序演示静态计数器如何在多个 Student 对象间共享。
public class Demo {
public static void main(String[] args) {
Student s1 = new Student();
s1.showData();
Student s2 = new Student();
s2.showData();
// Student.b++; // 取消注释可修改计数器
// s1.showData();
}
}
class Student {
int a; // 实例变量,默认 0
static int b; // 静态计数器,仅初始化一次为 0
Student() {
b++; // 每创建一个 Student 递增计数器
}
public void showData() {
System.out.println("Value of a = " + a);
System.out.println("Value of b = " + b);
}
}
用 java Demo 编译运行,输出如下:
下图展示引用变量与对象的创建过程,以及静态变量 b 如何在实例间共享。
类外部访问静态变量用 类名.变量名:
Student.b++; // 递增共享计数器
s1.showData(); // 将显示更新后的 b 值
尝试从静态上下文访问实例变量会导致编译错误:
error: non-static variable a cannot be referenced from a static context
a++;
这是因为静态方法不能直接访问实例字段。
Java 静态代码块
静态代码块是类首次加载进 JVM 时执行一次的特殊代码块。适合初始化需要复杂逻辑的静态字段。
class Test {
static int a;
static int b;
static {
a = 10;
b = 20;
}
}
运行下面程序演示静态代码块输出:
public class Demo {
static int a;
static int b;
static {
a = 10;
b = 20;
}
public static void main(String[] args) {
System.out.println("Value of a = " + a);
System.out.println("Value of b = " + b);
}
}
输出:
Value of a = 10 Value of b = 20
java
- Java 方法:定义、调用与高效使用全指南
- 深入理解 Java final 关键字:变量、方法与类的不可变性
- Java instanceof 运算符完全指南:用法、继承与接口检查
- 深入理解 Java 静态嵌套类:用法、差异与实战示例
- 精通 Java 匿名内部类:定义、语法与实战示例
- Java 单例模式详解:安全实现与使用指南
- 精通 Java 反射:运行时检查类、方法与字段
- 精通 Java 异常处理:try-catch、finally、throw 与 throws 详解
- 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
- 掌握 Java 泛型:构建可复用、类型安全的代码
- 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除
- Java 接口 vs 抽象类:如何选择合适的抽象方式