Java静态域、静态常量和静态方法

在几乎所有的程序里,main方法都被标记为static修饰符。那么我们就来讨论一下这个修饰符。

一、静态域

如果将一个域定义为 static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却有自己的一个拷贝。例如,在前面文章中用到的 Employee 类中,我们增加一个 ID 号。这里给它添加一个实例域 id 和静态域 nextId。

class Employee{
    private static int nextId = 1;   //静态域
    private int id;    //实力域

    ...
}

现在,每一个员工都有自己的一个 id 域,但这个类的所有实例将共享一个 nextId 域。换句话说,如果有 1000 个员工类的对象,则有 1000 个实力域 id。但是,只有一个静态域 nextId。即使没有一个员工对象,静态域 nextId 也存在。它属于类,而不属于任何独立的对象。(在绝大多数的面向对象程序设计语言中,静态域被称为类域。术语“static”只是沿用了 C++ 的叫法,并无实际意义。)

下面有代码来演示一下:

public class EmployeeTest {
    public static void main(String[] args){
        Employee[] temp = new Employee[5];

        for (int i = 0; i < 5; i++)
            temp[i] = new Employee();

        for (int i = 0; i < 5; i++){
            temp[i].setID();
            System.out.println("My number is: " + temp[i].getID());
        }
    }// main
}

class Employee{

    private int id;
    private static int nextId = 1;

    public Employee(){}

    public void setID(){
        id = nextId;
        nextId++;
    }

    public int getID(){
        return id;
    }

}

运行结果为:
这里写图片描述
可以看到,nextId 是在不断增加的,有5个对象,但是只有一个静态域 nextId。

二、静态常量

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

public class Mathematics{
    ...
    public static final double PI = 3.14159265358979323846;
    ...
}

在程序中,可以通过 Mathematics.PI 的形式获得这个常量。

如果 static 被省略,PI 就变成了 Mathematics 类的一个实例域。需要通过 Mathematics 类的对象访问,并且每一个 Mathematics 类的对象都有自己的一个 PI 的拷贝。

三、静态方法

静态方法是一种不能向对象实施操作的方法。例如,Math 类的 pow 方法就是一个静态方法。表达式 Math.pow(x, a) 计算x的a次幂。在运算时,不使用任何的 Math 对象。换句话,没有隐式的参数。

可以认为,静态方法时没有 this 参数的方法。

Employee 类的静态方法不能访问 Id 实力域,因为它不能操作对象。但是,静态方法可以访问自身中的静态域。下面是一个使用静态方法的示例:

public static int getNextId(){
    return nextId;   //returns static field
}

但是可以通过调用这个方法:int n = Employee.getNextId();
当然,这个方法是可以省略 static 关键字的,但是,需要通过 Employee 类对象引用调用这个方法。

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

在以下两种情况下使用静态方法:
1.一个方法不需要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)。
2.一个方法只需要访问类的静态域(例如:Employee.getNextId)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值