Java static关键字以及Java静态变量和静态方法
static 修饰变量或方法,表示它们是静态的:属于类,而不属于某一个对象。
静态变量和静态方法可以通过类名访问,不必先 new 出对象,所以也叫类变量和类方法。实例变量则必须通过对象访问,因为每个对象自己有一份,值可以不同。
| 对比 | 静态(类)成员 | 实例成员 |
|---|---|---|
| 内存 | 类加载时一份,所有对象共享 | 每 new 一次分配一份 |
| 访问 | 推荐 类名.成员;用对象访问会警告 | 只能通过对象,不能通过类名 |
| this / super | 静态方法里没有当前对象,不能用 | 实例方法里可以用 |
一、静态变量与内存分配
编译器只为整个类创建一份静态变量副本。多个实例共享这块内存:改 a 对象看到的静态值,b 对象立刻能看到。实例变量互不影响。
运行结果:类变量 i=10;实例变量 j=20。再看共享效果:
运行结果:obj1.i=10, obj1.j=20;obj2.i=10, obj2.j=0。通过 obj1 改 i,obj2 也变成 10;j 各有一份,obj2.j 仍是默认值 0。
静态变量在类装载时就会初始化,不管你用不用。访问控制允许时也可以通过对象访问静态成员,但不提倡,编译器会警告。外部两种正规访问方式:通过对象,或通过类名。
二、静态方法
静态方法不能对某个具体对象实施操作。例如 Math.pow(x, a) 计算 x 的 a 次幂,不必创建 Math 对象。因此静态方法里不能访问实例变量,只能访问本类的静态变量。
适合写成静态方法的情形:不需要对象状态、参数都由调用方显式传入(如 Math.pow);或者只需要访问类的静态变量。main() 也是静态的——程序启动时还没有任何对象,它是入口,负责创建后面要用的对象。
运行结果:10+10=20。规则汇总:
-
静态方法只能直接访问静态变量,不能直接调用非静态方法。 -
静态方法里没有 this,当然也不能用 super。 -
静态方法不能被覆盖(子类同名静态方法是隐藏,不是多态)。 -
构造方法不允许声明为 static;局部变量也不能用 static 修饰。
三、静态初始器(静态块)
块是大括号包围的一段代码。静态初始器是写在类里、方法外面的 static 块,类装载时(第一次使用该类时)只执行一次,常用来初始化静态变量。
运行结果先打印静态块,再打印 Demo.i=10 和 test method: i=10——访问 Demo.i 就会触发类加载,静态块已经执行过了。
四、静态导入
静态导入是 Java 5 的特性,用来导入类的静态变量和静态方法。普通导入是 import packageName.ClassName;;静态导入写成:
-
import static packageName.ClassName.methodName;导入某个静态方法 -
import static packageName.ClassName.*;导入该类全部静态成员
导入后可以直接用方法名调用,不必再写 ClassName.methodName。System.out 里的 out 就是 System 的静态变量,import static java.lang.System.* 之后可以直接 out.println()。
运行结果类似:产生的一个随机数:0.05800891549018705(每次不同)。
一句话总结:static 成员类加载时一份、大家共用;静态方法没有 this,只能碰静态的东西,要用时写 类名.成员。
转载请注明来源:Java static关键字以及Java静态变量和静态方法本文链接地址:https://ai.zhousir.top/?p=95






