一、概述
在 Java 中用 static 关键字修饰的变量、方法、代码块等称为静态变量、静态方法、静态代码块等,这些内容都有其特定的应用,以及不同于非静态的内存使用方式。
二、静态的应用
(1)静态变量
在一个类中,如果将其成员变量定义为静态变量,意味着其他类中的方法中可以直接通过“类名.变量名”的格式访问该变量,而不必在创建类的对象后通过对象访问该变量。
// 在类中定义一个静态成员变量,并在其他类中直接通过类名访问该变量
class StaticDemo1 {
static String name = "张三";
int age = 30;
void show () {
System.out.println(name);
}
}
class Demo {
public static void main (String[] args) {
String name = StaticDemo1.name;
System.out.println(name);
int age = new StaticDemo1().age;
System.out.println(age);
}
}
在上面的示例中,Demo 类中的主方法可以通过类名直接访问 StaticDemo1 类中的静态变量,而要访问非静态变量,而要创建对象,然后通过对象访问。这是因为用 static 关键字修饰的变量在创建类的实例化对象之前,就已经随着类一起进入到内存中,而非静态变量只有在创建了类的实例化对象之后才会在内存中。而且在内存中创建的对象中不包含静态变量,因此可以将类中不会改变的、所有对象之间相同的成员变量定义为静态变量。
(2)静态方法
用 static 关键字修饰的方法是静态方法,静态方法的调用方式和内存使用方式与静态变量类似,也可以通过类名调用类中的静态方法。
// 在类中定义一个静态方法,并在其他类中直接通过类名调用该方法
class StaticDemo2 {
static String name = "张三";
int age = 30;
static void show () {
System.out.println(name);
}
}
class Demo {
public static void main (String[] args) {
StaticDemo2.show();
}
}
需要注意的是,如果将一个方法定义为静态,那么它就只能访问静态的变量,而不能访问非静态的变量。
(3) 静态代码块
// 在类中包含一段静态代码块,并在其他类中直接通过类名调用类中的静态变量
class StaticDemo3 {
static String name = "张三";
static {
System.out.println("静态代码块");
}
}
class Demo {
public static void main (String[] args) {
int name = StaticDemo3.name;
}
}
在上面的例子中,static {…} 的部分就是静态代码块,静态代码块会随着类进入内存而执行,因此在 Demo 类的主函数中,虽然没有建立 StaticDemo3 类的对象,而只是通过类名访问了静态变量,静态代码块的中的打印语句也会执行,因为静态代码块具有这一特性,因此其可以用于类的初始化。