静态变量
有时候,我们希望某些特定的数据在内存中只有一份,而且能被一个类的所有实例对象所共享。例如某个学校所有学生共享同一个学校名称,此时完全不必在每个学生对象所占用的内存空间中都定义一个变量来表示学校名称,而可以在对象以外的空间定义一个表示学校名称的变量让所有对象来共享。
使用 static 关键字修饰成员变量,该变量被称作静态变量。静态变量被所有实例共享,使用 “类名.变量名” 的形式来访问,也可以使用 “实例对象.变量名” 的形式来访问。
Example.java 示例代码:
class Student{
static String schoolName; //定义静态变量 schoolName
}
public class Example{
public static void main(String[] args){
Student stu1 = new Student();
Student stu2 = new Student();
Student.schoolName = "中国大学";
System.out.println("我的学校是:" + stu1.schoolName);
System.out.println("我的学校是:" + stu2.schoolName);
}
}
此代码,说明定义的一个静态变量 schoolName,被所有的实例所共享。
注意: static 关键字只能用于修饰成员变量,不能修饰局部变量,否则编译会报错,下面的代码是非法的。
public class Student{
public void study(){
static int num = 10; //这行代码是非法的,编译会报错
}
}
静态方法(类似于python类方法)
有时,我们希望在不创建对象的情况下就可以调用某个方法,只需要在类中定义的方法前加上 static 关键字即可,这种方法被称为静态方法。静态方法可以使用 “类名.方法名” 的形式来访问,也可以通过 “实例对象.方法名” 来访问。
Example.java 示例代码:
class Person{
public static void sayHello(){ //定义静态方法
System.out.println("hello");
}
}
class Example {
public static void main(String[] args){
Person.sayHello(); //调用静态方法
}
}
注意: 没有被 static 关键字修饰的成员,需要先创建对象才能访问。
静态代码块
在 Java 类中,使用一对大括号包围起来的若干行代码被称为一个代码块,用 static 关键字修饰的代码块称为静态代码块。
当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。在程序中,通常会使用静态代码块来对类的成员变量进行初始化。
Example.java 示例代码:
class Example{
static{
System.out.println("测试类的静态代码块执行了");
}
public static void main(String[] args){
//下面的代码创建了两个 Person 对象
Person p1 = new Person();
Person p2 = new Person();
}
}
class Person {
static String country;
//下面是一个静态代码块
static {
country = "china";
System.out.println("Person 类中的静态代码块执行了");
}
}
在该代码中,main 方法中创建了两个 Person 对象,但在两次实例化对象的过程中,静态代码块只执行一次,这就说明类在第一次使用时才会被加载,并且只会加载一次。