Java中的static关键字用于指定一个成员(字段或方法)是静态的,属于类而不是对象。使用static关键字的主要目的是为了使得语法结构不再与对象实例相关,而是属于类本身,从而可以在不创建对象的情况下对静态方法和静态变量进行访问和调用,节省内存空间。通过static修饰的变量可以达到全局变量的效果。
public class Test { static int name; public static int sum(int a, int b) { return a + b; } public static void main(String[] args) { Test.name=2; int c =Test.sum(2,3); System.out.println(c); } }
static成员的主要特点是:
1.静态成员属于类,而不是对象。静态成员会在类初次加载时初始化,对象创建之前就存在了。
2.静态成员可以通过类名直接访问,不需要创建对象。
3.静态方法只能访问静态成员(静态字段和静态方法),不能访问非静态成员。
4.静态成员有且只有一份,所有对象实例都共享这一静态成员。非静态成员为每个对象实例创建一份拷贝。
5.静态方法中不能使用this和super关键字。
6.可以通过static关键字修饰变量达到全局变量的效果
常见的静态成员用法:
1.用来定义公共常量,比如Math.PI。
2.用来实现工具类,只提供静态方法,不需要创建实例,比如Collections类。
3.用来实现单例模式。
4.用来记录类级状态,如记录实例的个数。
当存在以下情况时,必须使用static关键字修饰成员变量或方法:
1.定义类级的常量。这种常量属于整个类,不依赖于任何对象实例,所以必须使用static修饰。
public class Constants {
public static final double PI = 3.14;
}
2.定义工具类,仅提供静态方法。这种类不需要创建实例,直接通过类名调用方法。
public class MathUtils {
public static int sum(int a, int b) {
return a + b;
}
}
3.实现单例模式。单例类只需要一个实例,所以要将构造方法私有化,并提供一个公共的静态方法来获取这个实例。
public class AppConfig {
private static AppConfig instance;
private AppConfig() {}
public static AppConfig getInstance() {
if(instance == null) {
instance = new AppConfig();
}
return instance;
}
}
4. 当方法中不需要访问任何实例成员,仅涉及参数运算或类级别状态的维护。
public class User {
public static int count = 0;public User() {
count++;
}public static int getCount() {
return count;
}
}
也就是说,如果成员属于类级别,不依赖于任何对象实例,就必须使用static关键字修饰,表示它是静态的。