Java static关键字全解析:从共享属性到工具类,一篇搞懂静态变量和静态方法

你有没有想过这些问题:
为什么main方法是static的?为什么工具类的方法都是static的?为什么静态方法里不能直接调用非静态方法?
今天这篇文章,我们就把static关键字彻底讲透。从共享属性到工具类,从内存原理到使用规范,一篇全搞定。
一、static修饰成员变量:共享数据
什么是静态变量?
被static修饰的成员变量叫静态变量,也叫类变量。它的核心特点是:被类的所有对象共享。
想象一个班级:每个学生都有自己的姓名、年龄(独有属性),但全班共享同一个班主任(共享属性)。这个“班主任”就适合用static修饰。
public class Student {
String name; // 独有属性,不加static
int age; // 独有属性,不加static
static String teacherName; // 共享属性,加static
}
静态变量的使用规则
-
加载时机:随类的加载而加载,优先于对象存在。类被用到时,静态变量就已经在内存中了。
-
调用方式:推荐用类名调用(
Student.teacherName),也可以用对象名调用,但不推荐。 -
共享特性:任何一个对象修改了静态变量,所有对象访问到的都是新值。
// 推荐调用方式
Student.teacherName = "小雯老师";
// 不推荐,但语法允许
stu1.teacherName = "阿玮老师";
什么时候用静态变量?
判断标准:这个属性是所有对象共享,还是每个对象独有?
-
共享 → 加static
-
独有 → 不加static
比如:学生姓名独有,不加;全班共享的班主任,加。
二、static修饰成员方法:工具方法
什么是静态方法?
被static修饰的成员方法叫静态方法。它多用于测试类和工具类,在Javabean实体类中很少使用。
静态方法的核心规则
-
静态方法只能访问静态成员(静态变量、静态方法)
-
非静态方法可以访问所有成员
-
静态方法中没有this关键字
为什么?因为静态内容随类加载,优先于对象存在。静态方法被调用时,对象可能还没创建,自然无法访问依赖对象的非静态内容,也没有this。
工具类实战:数组工具类
工具类是封装通用功能、提高代码复用性的类。它的编写规范:
-
类名见名知意,一般以
Util结尾 -
私有化构造方法,禁止外界创建对象
-
所有方法定义为静态,方便类名直接调用
下面是一个数组工具类的完整实现:
public class ArrayUtil {
// 私有化构造方法,禁止创建对象
private ArrayUtil() {}
// 格式化打印数组,返回字符串
public static String printArr(int[] arr) {
String result = "[";
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
result += arr[i] + "]";
} else {
result += arr[i] + ", ";
}
}
return result;
}
// 计算数组平均值(注意整数除法问题)
public static double getAverage(int[] arr) {
int sum = 0;
for (int num : arr) {
sum += num;
}
// 关键:乘以1.0转为浮点数,避免整数除法丢失精度
return sum * 1.0 / arr.length;
}
}
调用示例:
public class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
// 直接类名调用,不需要创建对象
System.out.println(ArrayUtil.printArr(arr));
System.out.println("平均值为:" + ArrayUtil.getAverage(arr));
}
}
三、重新认识main方法
学完static,我们终于能看懂main方法的每个部分了:
public static void main(String[] args)
| 部分 | 作用 |
|---|---|
public |
最大访问权限,保证JVM能调用 |
static |
JVM不需要创建对象,直接用类名调用 |
void |
main方法不需要给JVM返回值 |
main |
JVM约定的固定入口方法名 |
String[] args |
接收程序运行时传入的参数 |
四、static知识点速查表
| 维度 | 静态变量 | 静态方法 |
|---|---|---|
| 修饰对象 | 成员变量 | 成员方法 |
| 归属 | 属于类 | 属于类 |
| 加载时机 | 随类加载 | 随类加载 |
| 调用方式 | 类名/对象名(推荐类名) | 类名/对象名(推荐类名) |
| 访问限制 | - | 只能访问静态成员 |
| this关键字 | - | 不能使用 |
写在最后
static的核心就一句话:静态的东西属于类,不属于对象。
-
静态变量:所有对象共享一份数据
-
静态方法:工具类的标配,不用创建对象就能用
-
静态只能访问静态,非静态可以访问所有
搞懂这个逻辑,static你就拿捏了。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)