Java关键字static
一、static是什么?
static
是Java中的关键字,用于修饰类成员(变量、方法、代码块、内部类)或实现静态导包。它的核心作用是 让成员脱离对象依赖,直接通过类访问。
好比班级里的公共黑板(static
修饰的成员),所有学生(对象)共用同一块黑板;而每个学生的课桌(普通成员)则是各自独立的。
二、static的五大用法
1. 静态变量:共享的“公共财产”
- 特点:
- 所有对象共享同一份数据。
- 随类的加载而创建,优先于对象存在。
- 存储在方法区的静态区,内存只分配一次。
public class Person {
String name; // 成员变量(每个对象的私有财产)
static int age; // 静态变量(所有对象共享的公共财产)
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "小王"; // 正确:操作对象属性
p1.age = 20; // 正确但不推荐:通过对象访问静态变量
Person.age = 22; // 推荐:直接通过类名访问
}
}
无论创建多少对象,age
始终只有一份,所有对象共享它。
2. 静态方法:无需对象的“工具方法”
- 特点:
- 可直接通过类名调用(如
Math.max()
)。 - 只能访问静态成员,不能访问普通成员变量或方法。
- 不能使用
this
或super
。
- 可直接通过类名调用(如
public class Calculator {
static int add(int a, int b) { // 静态方法
return a + b;
}
void print() { // 普通方法
System.out.println(add(1, 2)); // 正确:普通方法可调用静态方法
}
public static void main(String[] args) {
int result = Calculator.add(3, 5); // 直接通过类调用
}
}
3. 静态代码块:类的“初始化器”
- 特点:
- 类加载时自动执行一次,优先于构造方法和主方法。
- 多个静态代码块按顺序执行。
- 用于初始化静态变量或加载资源(如配置文件)。
public class Database {
static String config;
static {
config = loadConfig(); // 模拟加载配置文件
System.out.println("静态代码块执行!");
}
public static void main(String[] args) {
// 即使不创建对象,静态代码块也会执行
}
}
- 执行顺序示例:
class Parent { static { System.out.println("父类静态代码块"); } } class Child extends Parent { static { System.out.println("子类静态代码块"); } } public class Test { public static void main(String[] args) { new Child(); // 输出:父类静态代码块 → 子类静态代码块 } }
4. 静态内部类:独立的“工具类”
- 特点:
- 无需依赖外部类实例即可创建。
- 只能访问外部类的静态成员。
- 适合定义与外部类相关但不依赖其数据的工具类。
public class Outer {
static int num = 10;
// 静态内部类
static class Inner {
void show() {
System.out.println(num); // 正确:访问外部类静态变量
}
}
public static void main(String[] args) {
Inner inner = new Outer.Inner(); // 直接创建
inner.show();
}
}
5. 静态导包:简化代码的“快捷方式”
- 作用:直接导入类的静态成员,无需写类名。
- 适用场景:频繁调用某个类的静态方法(如数学计算)。
// 未使用静态导包
System.out.println(Math.sqrt(4));
// 使用静态导包
import static java.lang.Math.*;
import static java.lang.System.*;
public class Test {
public static void main(String[] args) {
out.println(sqrt(4)); // 直接调用sqrt()和out
}
}
三、常见问题与注意事项
-
静态方法能调用非静态方法吗?
- 不能,静态方法无法访问实例成员,因为实例成员需要对象存在。
-
静态变量会被垃圾回收吗?
- 不会,静态变量随类存在,只有类被卸载时才会释放(通常程序结束时)。
-
什么时候用static?
- 数据需要全局共享时(如计数器)。
- 工具方法不需要对象状态时(如
Arrays.sort()
)。
四、总结
- 静态变量:共享数据,内存唯一。
- 静态方法:工具方法,无需对象。
- 静态代码块:初始化类,优先执行。
- 静态内部类:独立工具,减少依赖。
- 静态导包:简化代码,慎用防冲突。