在Java中,定义了一个static关键字,它用于修饰的成员变量,如成员变量、成员方法以及代码块等,被static修饰的成员变量具备一些特殊性。
1、静态变量
在定义一个类时,只是在描述某类事物的特征和行为,并没有产生具体的数据。只是通过new关键字创建该类的实例对象后,系统才会为每个对象分配内存空间,存储各自的数据。有时候,开发人员会希望某些特定的数据在内存中只有一份,而且能够被一个类的所有实例对象所共享。例如某个学校所有学生共享同一个学校名称,此时完全不必在每个学生对象所占用的内存空间中都声明一个变量来表示学校名称,而可以在对象以外的空间声明一个表示学校名称的变量来让所有对象来共享。
上图中,所有的学生对象共享一个名称为schoolName的变量,在一个Java类中,要实现这种功能可以使用static关键字来修饰成员变量,该变量被称为静态变量,它可以被所有实例所共享。
package demo;
class Student{
static String schoolName;
}
public class Static {
public static void main(String[] args){
Student stu1 = new Student();//创建学生对象1
Student stu2 = new Student();//创建学生对象2
Student.schoolName = "清华大学";//为静态变量赋值
//分别输出两个学生的信息
System.out.println("我是"+stu1.schoolName+"的学生");
System.out.println("我是"+stu2.schoolName+"的学生");
}
}
结果:
由于schoolName是静态变量,因此可以直接使用Student.schoolName的方式进行调用,也可以通过Student的实例对象进行调用,如stu1.schoolName。
注意
static关键字只能用于修饰成员变量,不能用于修饰局部变量。
2、静态方法
在实际开发中,开发人员有时会希望在不创建对象的情况下就可以调用某个方法,这种情况就可以使用静态方法。
静态方法的定义十分简单,只需要在类中定义的方法前加上static关键字即可。
如:
类名.方法
或
实例对象名.方法
package demo;
class Person{
public static void say(){//定义静态方法
System.out.println("Hello!");
}
}
public class Static1 {
public static void main(String[] args){
Person.say();//用"类名.方法"的方式调用静态方法
Person person = new Person();
person.say();//用"实例对象名.方法"来调用静态方法
}
}
结果:
注意:在一个静态方法中只能方法用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象。
3、静态代码块
在Java类中,使用一对大括号包围起来的若干行代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块。语法:
static{
.
.
.
}
当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块也只执行一次。在程序中,通常会使用静态代码块来对类的成员变量进行初始化。如:
package demo;
class User{
static{
System.out.println("执行了User类中的静态代码块");
}
}
public class Static2 {
static{
System.out.println("执行了测试类中的静态代码块");
}
public static void main(String[] args){
//实例化2个User对象
User u1 = new User();
User u2 = new User();
}
}
结果:
从结果可以看出,程序中的两段静态代码块都执行了。运行程序后,Java虚拟机首先会加载类Static2,在加载类的同时就会执行该类的静态代码块,紧接着会调用main()方法。在main()方法中创建了两个User对象,但在两次实例化对象的过程中,静态代码块中的内容只输出了一次,这就说明静态代码块在类第一次使用时才会被加载,并且只会加载一次。