你有没有想过这些问题:

为什么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实体类中很少使用。

静态方法的核心规则

  1. 静态方法只能访问静态成员(静态变量、静态方法)

  2. 非静态方法可以访问所有成员

  3. 静态方法中没有this关键字

为什么?因为静态内容随类加载,优先于对象存在。静态方法被调用时,对象可能还没创建,自然无法访问依赖对象的非静态内容,也没有this。

工具类实战:数组工具类

工具类是封装通用功能、提高代码复用性的类。它的编写规范:

  1. 类名见名知意,一般以Util结尾

  2. 私有化构造方法,禁止外界创建对象

  3. 所有方法定义为静态,方便类名直接调用

下面是一个数组工具类的完整实现:

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你就拿捏了。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐