- static变量(静态变量)
静态变量是被static关键字声明的类变量,它们属于类而不是类的实例。
特点:
所有实例共享同一个静态变量。
在类加载时初始化,且在程序运行期间始终存在。
示例:
public class Counter {
// 静态变量
private static int count = 0;
// 构造函数
public Counter() {
count++;
}
public static int getCount() {
return count;
}
}
在这个示例中,count是一个静态变量,所有Counter类的实例共用这个变量。
- static方法(静态方法)
静态方法是被声明为static的方法,可以直接通过类名访问,而无需创建实例。
特点:
不能直接访问实例变量和实例方法。
可以直接访问其他静态变量和方法。
示例:
public class MathUtil {
public static int add(int a, int b) {
return a + b;
}
}
// 调用静态方法
int sum = MathUtil.add(5, 10);
3. static块(静态初始化块)
static块是在类加载时执行的代码块,用于初始化静态变量。
特点:
仅执行一次,且在类的任何实例被创建之前执行。
示例:
public class Example {
private static int value;
static {
value = 10; // 初始化静态变量
System.out.println("静态初始化块执行");
}
}
4. 内存管理
static成员存储在方法区(Method Area),这些成员的生命周期是从类加载到程序终止。即便没有实例,静态变量依然存在。
- 单例模式(Singleton Pattern)
static关键字通常用于实现单例模式,确保某个类只有一个实例,并提供访问该实例的方法。
示例:
public class Singleton {
private static Singleton instance;
private Singleton() {} // 私有构造函数
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
6. 静态导入(Static Import)
静态导入是Java 5引入的功能,使得可以直接调用类的静态方法和字段,无需类名前缀。
示例:
import static java.lang.Math.*;
public class Test {
public static void main(String[] args) {
double result = sqrt(16); // 直接调用静态方法
System.out.println(result);
}
}
7. 静态接口成员
从Java 8开始,接口可以包含静态方法。静态接口方法能够直接通过接口调用。
示例:
public interface MyInterface {
static void staticMethod() {
System.out.println("这是静态方法");
}
}
// 调用静态接口方法
MyInterface.staticMethod();
8. 静态内部类
静态内部类是用static关键字声明的类,它不需要外部类的实例来创建。
特点:
可以访问外部类的静态成员,但不能访问外部类的实例成员。
示例:
public class Outer {
static int outerStaticVariable = 10;
static class Inner {
void display() {
System.out.println("外部类的静态变量: " + outerStaticVariable);
}
}
}
// 创建静态内部类的实例
Outer.Inner inner = new Outer.Inner();
inner.display();
9.static 关键字的使用注意事项
不能访问非静态成员:在静态方法中,不能直接访问非静态变量或方法,必须通过对象引用来访问。
共享数据:static 变量是共享的,所有实例都共享同一个变量,因此对 static 变量的修改会影响到所有实例。
在单例模式中使用:static 可以用于实现单例模式,通过 static 方法或变量来确保只有一个实例存在。