Java 中的 static 关键字

本文介绍了如何在Java中使用static关键字创建不依赖于对象的类数据和类方法。静态成员可以共享存储空间,适用于无需实例化的单例数据或全局方法调用。理解静态与非静态的区别有助于提升代码组织和性能。

背景:

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

但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据——无
论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任
何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。
解决方案:
为满足这两方面的要求,可使用
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。
总结:
尽管是“静态”的,但只要应用于一个数据成员,就会明确改变数据的创建方式(一个类一个成员,以及每 个对象一个非静态成员)。若应用于一个方法,就没有那么戏剧化了。对方法来说,static 一项重要的用途 就是帮助我们在不必创建对象的前提下调用那个方法。正如以后会看到的那样,这一点是至关重要的——特别是在定义程序运行入口方法 main()的时候。
和其他任何方法一样,static 方法也能创建自己类型的命名对象。所以经常把 static 方法作为一“领头 羊”使用,用它生成一系列自己类型的“实例”。
### Javastatic关键字的用法和含义 在Java中,`static`关键字是一个非常重要的概念,主要用于内存管理以及实现与对象无关的功能。以下是关于`static`关键字的详细说明,包括其意义和使用场景。 #### 1. `static`的基本含义 `static`翻译为“静态的”,表示该成员属于本身而不是的某个具体实例[^1]。因此,即使没有创建对象,也可以通过名直接访问`static`修饰的成员或方法。 #### 2. 使用场景 `static`关键字可以用于修饰变量、方法、代码块和内部。以下是具体的使用场景: - **静态变量(变量)** 静态变量是被所有对象共享的变量。一旦定义了静态变量,无论创建多少个对象,该变量在内存中只有一个副本。例如: ```java class Counter { public static int count = 0; // 静态变量 public Counter() { count++; } } ``` 在上述代码中,每次创建`Counter`对象时,`count`值都会递增,并且所有对象共享同一个`count`变量[^2]。 - **静态方法** 静态方法属于本身,可以通过名直接调用,而无需创建对象。静态方法不能访问非静态成员(实例变量或实例方法),因为它们不依赖于任何特定的对象[^3]。 ```java class MathUtil { public static int add(int a, int b) { // 静态方法 return a + b; } } ``` 调用方式:`MathUtil.add(3, 5);` - **静态代码块** 静态代码块用于初始化中的静态资源,它只会在加载时执行一次[^5]。例如: ```java class Example { static { System.out.println("静态代码块执行"); } } ``` - **静态内部** 静态内部可以独立于外部实例存在,不需要创建外部对象即可实例化静态内部[^3]。例如: ```java class OuterClass { static class StaticInnerClass { public void display() { System.out.println("静态内部方法"); } } } ``` 调用方式:`OuterClass.StaticInnerClass obj = new OuterClass.StaticInnerClass();` #### 3. 意义 `static`的关键意义在于提供了一种机制,使得某些功能或数据可以独立于对象存在,从而节省内存并提高程序效率。例如,`main`方法必须声明为`static`,以便JVM可以直接调用它而无需创建对象[^4]。 ### 示例代码 以下是一个综合示例,展示`static`关键字的不同用法: ```java class Demo { public static int sharedValue = 0; // 静态变量 public int instanceValue = 0; // 实例变量 public static void staticMethod() { // 静态方法 System.out.println("这是静态方法"); // System.out.println(instanceValue); // 错误:无法访问实例变量 } public void instanceMethod() { // 实例方法 System.out.println("这是实例方法"); System.out.println(sharedValue); // 可以访问静态变量 } static { // 静态代码块 System.out.println("静态代码块执行"); } } public class Main { public static void main(String[] args) { Demo.staticMethod(); // 直接调用静态方法 System.out.println(Demo.sharedValue); // 直接访问静态变量 Demo demo = new Demo(); demo.instanceMethod(); // 调用实例方法 } } ``` #### 输出结果 ``` 静态代码块执行 这是静态方法 0 这是实例方法 0 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值