静态变量
在定义一个类时,只是在描述某类事物的特征和行为,并没有产生具体的数据只有通过new关键字创建该类的实例对象后,系统才会为每个对象分配空间,存储各自的数据。有时候,开发人员会希望某些特定的数据在内存中只有一份而且能够被一个类的所有实例对象所共享。例如某个学校所有学生共享同一个学校名称,此时完全不必在每个学生对象所占用的内存空间中都定义一个变量来表示学校名称,而可以在对象以外的空间定义一个表示学校名称的变量,让所有对象来共享。
class Student{
static String schoolName; //定义静态变量schoolName
}
public class Example12 {
public static void main(String[] args) {
//静态成员调用方式:类名.静态成员变量
Student.schoolName = "希望小学"; //为静态变量赋值
Student s1 = new Student(); //创建学生对象
Student s2 = new Student();
System.out.println("my school is "+s1.schoolName);
System.out.println("my school is "+s2.schoolName);
}
}
在一个Java类中,可以使用static关键字来修饰成员变量,该变量被称作静态变量。静态变量被所有实例共享,可以使用“类名.变量名”的形式来访问。
注意: static关键字只能用于修饰成员变量,不能用于修饰局部变量否则编译会报错。
静态方法
在实际开发时,开发人员有时会希望在不创建对象的情况下就可以调用某个方法,换句话说也就是使该方法不必和对象绑在一起。要实现这样的效果,只需要在类中定义的方法前加上static关键字即可,通常称这种方法为静态方法。同静态变量一样,静态方法可以使用“类名.方法名”的方式来访问,也可以通过类的实例对象来访问。
注意:在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象。
class Person{
private int age;
private static String name = "Tony";
public static void speak() //定义静态方法
{
System.out.println("hello "+name);
}
}
public class Example13 {
public static void main(String[] args) {
//1、类名.方法的方式调用静态方法
Person.speak();
//2、实例化对象方式调用静态方法
Person p = new Person();
p.speak();
}
}
静态代码块
在Java类中,使用一对大括号包围起来的若干行代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块。当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。在程序中,通常会使用静态代码块来对类的成员变量进行初始化。
/*
* 静态代码块
*
*/
class Person{
//静态代码块
static{
System.out.println("Person类中的静态代码块执行了");
}
}
public class Example14 {
//静态代码块
static{
System.out.println("测试类中的静态代码块执行了");
}
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
}
}