静态域与静态方法

  • 静态域

如果将域定义为static,每个类中只有这样一个域.而每一个对象对于所有的实例域却都有自己的一份拷贝.例如需要给每一个雇员赋予唯一的标识码.这里给Employee类添加一个实例域id和一个静态域nextId:

class Employee{
    private static int nextId = 1;
    private int id;
    ......  
}

现在每个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextId域.换句话说,如果有1000个Employee类的对象,则有1000个实例域id,但是,只有一个静态域nextId.即使没有一个雇员对象,静态域nextId也存在.它属于类,而不属于任何独立的对象.

  • 静态常量

静态变量使用得比较少,但静态常量却使用得比较多.例如,在Math类中定义了一个静态常量:

public class Math{
    ....
    public static final double PI = 3.1415926;
    ....
}    

在程序中,可以采用Math.PI的形式获得这个常量.

如果关键字static被省略,PI就变成了Math类的一个实例域.需要通多Math类的对象访问PI,并且每一个Math对想都有它自己的一份PI拷贝.

  • 静态方法

静态方法是一种不能向对象实施操作的方法.例如Math类的pow方法就是一个静态方法.表达式

Math.pow(x,a);

在运算时,不使用任何Math对象.换句话说,没有隐式的参数.

可以认为静态方法是没有this参数的方法(在一个非静态方法中,this参数表示这个方法的隐式参数)

Employee类的静态方法不能访问Id实例域,因为它不能操作对象.但是,静态方法可以访问自身类中的静态域.

public static int getNextId(){
    return nextId;
}

可以通过类名调用这个方法

int n = Employee.getNextId();

 

注意:可以使用对象调用静态方法.例如,如果harry是一个Employee对象,可以使用Harry.getNextId()代替Employee.getNextId().不过,这种方式和容易造成混淆,其原因是getNextId方法计算的结果与harry毫无关系,所以建议使用类名,而不是对象来调用静态方法

一般在下面两种情况下使用静态方法:

  • 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)
  • 一个方法只需要访问类的静态域(例如:Employee.getNextId())
posted @ 2020-09-21 11:46  刘指导  阅读(318)  评论(0编辑  收藏  举报