Java 中 static 关键字的作用详解
static 是 Java 中用于修饰类成员的关键字,它使成员独立于对象,直接归属于类本身。以下是 static 的主要作用和应用场景:
1. 静态变量(类变量)
特点
-
被所有对象共享,内存中只有一份。
-
在类加载时初始化,优先于对象存在。
-
通过
类名.变量名直接访问。
示例
class Counter {
static int count = 0; // 静态变量
Counter() {
count++; // 所有对象共享同一个 count
}
}
public class Main {
public static void main(String[] args) {
new Counter();
new Counter();
System.out.println(Counter.count); // 输出 2
}
}
适用场景:全局计数器、常量(如 static final PI = 3.14)。
2. 静态方法(类方法)
特点
-
不能访问非静态成员(属性和方法),因为非静态成员依赖对象。
-
通过
类名.方法名()调用。 -
常用于工具类(如
Math.sqrt())。
示例
class MathUtils {
static int add(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
int sum = MathUtils.add(3, 5); // 直接通过类名调用
System.out.println(sum); // 输出 8
}
}
适用场景:工具方法(如 Arrays.sort())、工厂方法。
3. 静态代码块
特点
-
在类加载时执行一次,用于初始化静态资源。
-
多个静态代码块按顺序执行。
示例
class Database {
static String url;
static {
url = "jdbc:mysql://localhost:3306/mydb"; // 初始化静态变量
System.out.println("数据库连接已配置");
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Database.url); // 触发静态代码块执行
}
}
适用场景:加载配置文件、初始化静态资源(如数据库连接池)。
4. 静态内部类
特点
-
不依赖外部类实例,可直接创建。
-
不能访问外部类的非静态成员。
示例
class Outer {
static class Inner { // 静态内部类
void show() {
System.out.println("静态内部类");
}
}
}
public class Main {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner(); // 直接实例化
inner.show();
}
}
适用场景:工具类辅助结构(如 HashMap.Node)。
5. 静态导入(Static Import)
特点
-
直接导入类的静态成员,省略类名前缀。
示例
import static java.lang.Math.PI;
import static java.lang.Math.sqrt;
public class Main {
public static void main(String[] args) {
System.out.println(PI); // 直接使用 PI
System.out.println(sqrt(9)); // 直接调用 sqrt()
}
}
适用场景:频繁使用某个类的静态成员(如数学计算)。
关键注意事项
-
静态 vs 非静态
-
静态成员属于类,非静态成员属于对象。
-
静态方法中不能使用
this或super。
-
-
内存分配
-
静态变量存储在方法区(JDK 8+ 的元空间),生命周期与类相同。
-
-
线程安全
-
静态变量是共享资源,多线程环境下需同步(如加
synchronized)。
-
常见面试问题
Q1:能否重写静态方法?
不能。静态方法在编译时绑定(静态分派),而方法重写是运行时多态(动态分派)。
Q2:main 方法为什么是静态的?
因为 JVM 调用 main 时无需创建对象,直接通过类名访问。
Q3:静态方法能否访问实例变量?
不能。实例变量依赖对象存在,而静态方法调用时可能没有对象。
总结
| 修饰目标 | 作用 | 示例 |
|---|---|---|
| 静态变量 | 所有对象共享,类级别存储 | static int count; |
| 静态方法 | 独立于对象,直接通过类名调用 | Arrays.sort() |
| 静态代码块 | 类加载时初始化资源 | static { ... } |
| 静态内部类 | 不依赖外部类实例,可直接创建 | Outer.Inner obj = new ... |
| 静态导入 | 省略类名前缀,直接使用静态成员 | import static Math.PI; |
static 的核心思想:将成员提升到类级别,减少对象依赖,优化资源使用。
1452

被折叠的 条评论
为什么被折叠?



