Static 关键字

一般,咱们建立类时会指出那个类的对象的外观与行为。除非用new 建立那个类的一个对象,不然实际上并未获得任何东西。只有执行了new 后,才会正式生成数据存储空间,并可以使用相应的方法。但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据——不管要建立多少个对象,甚至根本不建立对象。另外一种情形是咱们须要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即便没有建立对象,也须要一个能调用的方法。为知足这两方面的要求,可以使用static(静态)关键字。一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一块儿。因此尽管从未建立那个类的一个对象,仍能调用一个static 方法,或访问一些static 数据。而在这之53前,对于非static 数据和方法,咱们必须建立一个对象,并用那个对象访问数据或方法。这是因为非static 数据和方法必须知道它们操做的具体对象。固然,在正式使用前,因为static 方法不须要建立任何对象,因此它们不可简单地调用其余那些成员,同时不引用一个已命名的对象,从而直接访问非static 成员或方法(由于非static 成员和方法必须同一个特定的对象关联到一块儿)。有些面向对象的语言使用了“类数据”和“类方法”这两个术语。它们意味着数据和方法只是为做为一个总体的类而存在的,并非为那个类的任何特定对象。有时,您会在其余一些Java 书刊里发现这样的称呼。为了将数据成员或方法设为static,只需在定义前置和这个关键字便可。例如,下述代码能生成一个static数据成员,并对其初始化:
class StaticTest {
Static int i = 47;
}
如今,尽管咱们制做了两个StaticTest 对象,但它们仍然只占据StaticTest.i 的一个存储空间。这两个对象都共享一样的i。请考察下述代码:

StaticTest st1 = new StaticTest();编程

StaticTest st2 = new StaticTest();spa

此时,不管st1.i 仍是st2.i 都有一样的值47,由于它们引用的是一样的内存区域。有两个办法可引用一个static 变量。正如上面展现的那样,可经过一个对象命名它,如st2.i。亦可直接用它的类名引用,而这在非静态成员里是行不通的(最好用这个办法引用static 变量,由于它强调了那个变量的“静态”本质)。对象

StaticTest.i++;内存

其中,++运算符会使变量增值。此时,不管st1.i 仍是st2.i 的值都是48。
相似的逻辑也适用于静态方法。既可象对其余任何方法那样经过一个对象引用静态方法,亦可用特殊的语法格式“类名.方法()”加以引用。静态方法的定义是相似的:
class StaticFun {
static void incr() { StaticTest.i++; }
}
从中可看出,StaticFun 的方法incr()使静态数据i 增值。经过对象,可用典型的方法调用incr():
StaticFun sf = new StaticFun();
sf.incr();

或者,因为incr()是一种静态方法,因此可经过它的类直接调用:StaticFun.incr();尽管是“静态”的,但只要应用于一个数据成员,就会明确改变数据的建立方式(一个类一个成员,以及每一个对象一个非静态成员)。若应用于一个方法,就没有那么戏剧化了。对方法来讲,static 一项重要的用途就是帮助咱们在没必要建立对象的前提下调用那个方法。正如之后会看到的那样,这一点是相当重要的——特别是在定义程序运行入口方法main()的时候。和其余任何方法同样,static 方法也能建立本身类型的命名对象。因此常常把static 方法做为一个“领头羊”使用,用它生成一系列本身类型的“实例”。class

摘录于《Java编程思想》第二章变量