static用法小结

关键字static有一段不寻常的历史。

(一)起初,C引入关键字static是为了表示退出一个块儿后依然存在的局部变量。在这种情况下术语“static”是有意义的:变量一致存在,当再次进入该块时仍然存在。如:

int add()
{
  static a=1;
  return a++;
}

void main()
{
  int b=0;
  int i;
  for(i=0;i<3;i++)
    b+=add();
  printf("b=%d\n",b);
}

result: b=3

(二)随后,static在C中有了第二种含义,表示不能被其他文件访问的全局变量和函数。为了避免引入一个新的关键字,关键字static被重用了。

(三)最后,C++第三次重用了这个关键字,与前面赋予的含义完全不一样,这里将其解释为:属于类且不属于类对象的变量和函数。这个含义与Java相同。对于static,此时要从静态域和静态方法两个方面考虑。

1、静态域

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

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

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

下面实现一个简单的方法:

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

假定为harry设定雇员标识码:

harry.setId();

harry的id域被设置为静态域nextId当前的值,并静态域nextId的值加1:

harry.id=Employee.nextId;
Employee.nextId++;

2、静态方法

静态方法是一种不能向对象实施操作的方法。静态方法不能操作对象,所以不能在静态方法中访问实例域。但是,静态方法可以访问自身类中的静态域。所以,静态方法一般用于以下两种情况:

  • 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)
  • 一个方法只需访问类的静态域

静态方法还有一种常见的用途。NumberFormat类使用factory方法产生不同风格的格式对象(这个我自己也没看懂是什么意思-P112)。

需要注意,不需要使用对象调用静态方法。例如,不需要构造Math类对象就可以调用Math.pow。

同理,main方法就是一个静态方法。main方法不对任何对象进行操作。事实上,在启动程序时还没有任何一个对象。静态的main方法将执行并创建程序所需的对象。


参考资料:

《JAVA核心技术 卷1 第8版》4.4静态域与静态方法


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值