返回介绍

2.6.3 static 关键字

发布于 10-15 23:56 字数 1948 浏览 0 评论 0 收藏 0

通常,我们创建类时会指出那个类的对象的外观与行为。除非用 new 创建那个类的一个对象,否则实际上并未得到任何东西。只有执行了 new 后,才会正式生成数据存储空间,并可使用相应的方法。

但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用 static(静态)关键字。一旦将什么东西设为 static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个 static 方法,或访问一些 static 数据。而在这之前,对于非 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();

此时,无论 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 方法作为一个“领头羊”使用,用它生成一系列自己类型的“实例”。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文