静态变量和静态方法
在介绍静态变量和静态方法之前,首先需要介绍 static 关键字,因为由 static 修饰的变量和方法被称为静态变量和静态方法。
有时,在处理问题时会需要两个类在同一个内存区域共享一个数据。例如,在球类中使用圆周率 PI 这个值,可能除了本类需要这个值,在另一个圆类中也需要这个值。这时没有必要在两个类中同时创建 PI,因为这样系统会将这两个不在同一个类中定义的静态值分配到不同的内存空间中。为了解决这个问题,可以将 PI 设置为静态的。PI 在内存中被共享的布局如图6.10所示。
被声明为 static 的变量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和 “.” 运算符调用静态成员。语法如下:

类名.静态类成员
【例6.4】创建并调用静态变量和静态方法(实例位置:资源包\TM\sl\6\4)
创建 StaticDemo 类,在类中使用 static 关键字定义一个变量和一个方法,并在主方法中调用它们。
public class StaticDemo {
static double PI = 3.1415; // 在类中定义静态常量
public static void method() { // 在类中定义静态方法
System.out.println("这是静态方法");
}
public static void main(String[] args) {
System.out.println(StaticDemo.PI); // 调用静态常量
StaticDemo.method(); // 调用静态方法
}
}
运行结果如下:
3.1415
这是静态方法
虽然静态成员也可以使用 “对象.静态成员” 的形式进行调用,但通常不建议用这样的形式,因为这样容易混淆静态成员和非静态成员。 |
静态变量与静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循 public、private 和 protected 修饰符的约束。
【例6.5】统计顾客总人数(实例位置:资源包\TM\sl\6\5)
在 Cust 类中创建一个静态整数类型属性 count,在构造方法中让 count 自增。
public class Cust {// 顾客类
static int count = 0;// 共享的属性:人数
String name;// 名称属性
public Cust(String name) {
this.name = name;// 记录名称
count++;// 人数递增
}
public static void main(String[] args) {
Cust c1 = new Cust("tom");
System.out.println("我是第" + Cust.count + "名顾客,我叫" + c1.name);
Cust c2 = new Cust("张三");
System.out.println("我是第" + Cust.count + "名顾客,我叫" + c2.name);
Cust c3 = new Cust("狗蛋儿");
System.out.println("我是第" + Cust.count + "名顾客,我叫" + c3.name);
}
}
运行结果如下:
我是第1名顾客,我叫tom
我是第2名顾客,我叫张三
我是第3名顾客,我叫狗蛋儿
从这个结果中可以看出,因为 count 是用 static 修饰的,对于所有顾客来说这是一个共享的属性,每创建一个顾客,count 这个属性都会加 1,所以最后 count 统计出来的就是顾客的总人数。
如果在执行类时,希望先执行类的初始化动作,可以使用 static 定义一个静态区域,这块区域称为静态代码块。当类文件被执行时,会首先执行 static 块中的程序,并且只会执行一次。静态代码块的语法如下:
public class example {
static {
... // 可以在这里写初始化的代码
}
}
最后总结使用 static 关键字要注意的以下几点:
-
在静态方法中不可以使用 this 关键字。
-
在静态方法中不可以直接调用非静态方法。
-
局部变量不可以使用 static 关键字进行声明。
-
主方法必须用 static 关键字进行声明。
-
只有内部类可以使用 static 关键字进行声明。
编程训练(答案位置:资源包\TM\sl\6\编程训练)
【训练5】信用卡消费记录 使用静态变量定义使用信用卡消费的总次数,控制台先输出使用信用卡消费时的每一条交易信息,再输出使用信用卡消费的总次数。运行结果如下:
您有一笔大额消费,交易金额:1550.0元。
您有一笔大额消费,交易金额:1920.0元。
您有一笔大额消费,交易金额:1979.0元。
您有一笔大额消费,交易金额:2259.0元。
您有一笔大额消费,交易金额:1835.0元。
您有一笔大额消费,交易金额:1799.0元。
您有一笔大额消费,交易金额:2688.0元。
您最近有7笔交易。
【训练6】水池放水 创建一个水池类,在类中先定义一个静态变量表示水池中的水量,并初始化为0;再定义两个静态方法,即注水(一次注入3个单位)方法和放水(一次放出2个单位)方法。通过调用这两个静态方法,控制水池中的水量。