一般情况下,类的成员(变量或方法)必须通过该类的对象访问。但有的时候希望定义一个类的成员,可以独立于该类的任何对象。Java提供了这种机制,只需要在类成员的声明前面加上关键字static即可。
由static修饰的成员变量和成员方法被称为静态变量和静态方法,例如最常见的静态方法就是main()方法。因为在程序开始执行时必须首先调用main()方法,此时还没有实例化任何对象,无法通过对象调用,所以它被声明为静态方法被系统直接调用。
如果一个类的成员变量被static修饰,那么这个成员变量就是静态成员变量,也可以简称为静态变量。
静态变量不属于类的某个具体对象,被该类所有的对象共享。该类的任何对象访问它时都会取得相同的值。如果一个对象修改了静态变量的值,其他对象读出的都是修改后的值。
静态变量既可以被对象调用也可以通过类名调用。调用静态变量的语法格式如下。
对象.静态变量
类名.静态变量
下面通过一个示例演示静态变量的调用方法。
【例3-7】静态变量的调用。
功能实现: 在StaticTest1类中通过两种方法调用静态变量。
public class StaticTest1 {
static int count=1; //静态变量
public static void main(String[] args) {
StaticTest1 static1 = new StaticTest1();
//通过对象调用静态变量count
int count1 = static1.count;
System.out.println("通过对象调用静态变量的返回值:" +count1);
//通过类名调用静态变量count
int count2 =StaticTest1.count;
System.out.println("通过对象调用静态变量的返回值:" +count2);
}
}
程序运行结果如图3-13所示。
图3-13 例3-7运行结果
程序可以正常执行,说明静态变量既可以通过对象调用也可以通过类名调用,而且返回值完全一样。
静态变量被类的所有对象共享,同一时间点它的值是唯一的,那就意味着如果有一个对象修改了静态变量的值,那么其他对象读出的都是修改后的值。下面通过一个示例演示这一特性。
【例3-8】验证静态变量值的唯一性。
功能实现: 在StaticTest2类中,通过不同的对象和类名调用静态变量,验证值的唯一性。
public class StaticTest2 {
static int count=1; //静态变量
public static void main(String[] args) {
//创建两个对象
StaticTest2 static1 = new StaticTest2();
StaticTest2 static2 = new StaticTest2();
//通过第一个对象修改静态变量的值
static1.count=2;
//通过不同的对象调用静态变量
System.out.println("通过对象1调用静态变量的返回值:" +static1.count);
System.out.println("通过对象2调用静态变量的返回值:" +static2.count);
//通过类名调用静态变量
System.out.println("通过类名调用静态变量的返回值:" +StaticTest2.count);
}
}
程序运行结果如图3-14所示。
图3-14 例3-8的运行结果
程序分析: 静态变量count的初始值为1。在main()方法中,通过对象static1把count的值修改为2,然后分别通过两个对象和类名调用静态变量,返回值都是修改后的值,证明了静态变量在同一时间点值是唯一的。
由static关键词修饰的方法就是静态方法。静态方法既可以通过对象调用,也可以通过类名调用。
调用静态方法的语法格式如下。
对象.静态方法
类名.静态方法
下面通过一个示例演示静态方法的调用。
【例3-9】静态方法的调用。
功能实现: 在StaticTest3类中通过两种方法调用静态方法。
public class StaticTest3 {
static int count =1; //静态变量
//静态方法
public static int getCount() {
return count;
}
public static void main(String[] args) {
//创建对象
StaticTest3 static1 = new StaticTest3();
//通过对象调用静态方法
System.out.println("通过对象调用静态方法的返回值:" +static1.getCount());
//通过类名调用静态方法
System.out.println("通过类名调用静态方法的返回值:" +StaticTest3.getCount());
}
}
程序运行结果如图3-15所示。
图3-15 例3-9的运行结果
程序可以正常执行,说明静态方法既可以通过对象调用也可以通过类名调用,返回值一样。
静态方法和非静态方法的区别主要体现在以下两方面。
①调用静态方法时,既可以通过类名调用也可以通过对象调用,非静态方法只能通过对象调用。
②静态方法只允许使用类中的静态变量和静态方法,不能使用类中的非静态成员变量和成员方法,而非静态方法没有这方面的限制。