一、介绍。
/**************************************************************THINKING IN JAVA********************************************************************/
通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。
有两种情形用上述方法是无法解决的。一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象。另一种情形是,希望某个方法不与包含它含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用这个方法。
通过static关键字可满足这两方面的需要。当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。通常,你必须创建一个对象,并用它来访问数据或方法。因为非static域和方法必须知道它们运作的特定对象。/*(在用static方法前不需要创建任何对象;所以对于static方法,不能简单地通过调用其他非static域或方法而没有指定某个命名对象,来直接访问非static域或方法(因为非static域或方法必须与某一特定对象关联))。*/
有些面向对象语言采用类数据和类方法两个术语,代表那些数据和方法只是作为整个类,而不是类的某个特定对象而存在的。
/**************************************************************THINKING IN JAVA********************************************************************/
二、进入static世界。
1.静态域
1 class Employee{ 2 private static int nextId=1; 3 private int id; 4 }
每个对象都有自己的id域,但是这个类所有实例将共享一个nextId域。1000个Employee类的对象,就有1000个实例域id。但是nextId只有一个。即使没有对象,静态域nextId也存在。它属于类而不属于任何独立的对象。
2.静态常量
静态常量使用的比较少,但静态常量却使用得比较多。例如,在Math类中定义了一个静态常量:
1 public class Math{ 2 public static final double PI=3.1415926535; 3 }
在程序中,可以采用Math.PI的形式获得这个变量。
另一个多次使用的静态常量是System.out。它在System类中声明:
1 public class System{ 2 public static final PrintStream out=....; 3 }
3.静态方法
静态方法是一种不能向对象实施操作的方法。例如,Math类的pow方法就是一个静态方法。静态方法是没有this参数的方法。
静态方法不能操作对象,所以不能在静态方法中访问实例域。但是,静态方法可以访问自身类中的静态域。
4.工厂方法
静态方法还有