Java中static关键字的用法与场景深入理解

 更新时间:2026年11月05日 09:01:21   作者:༄沐࿆风࿆࿆  
在Java语言中,static关键字是一种非常重要的修饰符,可以用于变量、方法、代码块和内部类等语法结构中,这篇文章主要介绍了Java中static关键字用法与场景的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在 Java 开发中,static 是一个高频使用且非常重要的关键字,无论是日常编码、面试还是源码阅读,都离不开对 static 的理解。它可以用来修饰类的成员变量、成员方法、代码块以及内部类,核心作用是将类的成员与对象实例解绑,让其属于类本身。

本文将从 static 的核心概念、四种使用场景、内存机制、使用注意事项以及面试高频考点,全方位带你吃透 Java static 关键字,新手也能轻松掌握。

一、static 关键字核心概念

static 是静态的意思,被 static 修饰的成员(变量、方法、代码块、内部类)统称为静态成员,具有以下核心特点:

  1. 属于类,不属于对象:静态成员随类的加载而创建,不依赖于任何对象实例;
  2. 全局共享:所有对象共享同一个静态成员,修改一处,所有引用处都会生效;
  3. 直接通过类名访问:无需创建对象,可直接用 类名.静态成员 调用(也能用对象调用,但不推荐);
  4. 生命周期:随类加载而初始化,随类卸载而销毁,优先于对象存在。

二、static 的 4 种核心使用场景

1. 静态变量(类变量)

用 static 修饰的成员变量叫静态变量,未被 static 修饰的叫实例变量。

语法:

修饰符 static 数据类型 变量名 = 初始值;

特点:

  • 属于类,所有对象共享一份内存;
  • 类加载时初始化,存储在方法区(JDK8 后在元空间);
  • 推荐用类名直接访问。

代码示例:

public class Student {
    // 实例变量:每个对象独有一份
    private String name;
    // 静态变量:所有Student对象共享
    public static String school = "北京大学";

    // 构造方法
    public Student(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        // 无需创建对象,直接通过类名访问静态变量
        System.out.println(Student.school);

        // 创建两个对象
        Student s1 = new Student("张三");
        Student s2 = new Student("李四");

        // 两个对象共享同一个静态变量
        System.out.println(s1.school); // 北京大学
        System.out.println(s2.school); // 北京大学

        // 修改静态变量,所有对象的school都会改变
        Student.school = "清华大学";
        System.out.println(s1.school); // 清华大学
        System.out.println(s2.school); // 清华大学
    }
}

使用场景:定义全局共享的常量、配置信息(如工具类的默认值、计数变量)。

2. 静态方法(类方法)

用 static 修饰的成员方法叫静态方法,无需创建对象即可调用。

语法:

修饰符 static 返回值类型 方法名(参数列表) { 方法体 }

核心规则(面试必问):

  • 静态方法不能直接访问类的非静态成员(变量、方法);
  • 静态方法可以直接访问类的静态成员;
  • 静态方法不能使用 this、super 关键字(因为 this 代表当前对象,静态方法不依赖对象);
  • 静态方法可以被继承,但不能被重写(重写是基于多态,多态依赖对象)。

代码示例:

public class StaticMethodDemo {
    // 静态变量
    private static int count = 0;
    // 实例变量
    private String msg = "hello";

    // 静态方法
    public static void addCount() {
        // 正确:静态方法访问静态变量
        count++;
        // 错误:静态方法不能直接访问实例变量
        // System.out.println(msg);
        // 错误:静态方法不能使用this
        // this.count++;
    }

    // 实例方法
    public void show() {
        // 正确:实例方法可以访问静态成员
        System.out.println(count);
        // 正确:实例方法可以访问实例成员
        System.out.println(msg);
    }

    public static void main(String[] args) {
        // 直接通过类名调用静态方法
        StaticMethodDemo.addCount();
        System.out.println(StaticMethodDemo.count); // 1
    }
}

使用场景:工具类方法(如 Arrays.sort ()、Math.random ())、无需依赖对象的通用逻辑。

3. 静态代码块

用 static 修饰的代码块,叫静态代码块,是类加载时自动执行的代码,只执行一次。

语法:

static {
    // 代码逻辑
}

特点:

  • 类加载时执行,优先于构造方法、普通代码块;
  • 一个类可以有多个静态代码块,按顺序执行;
  • 只能访问静态成员,不能访问实例成员。

代码示例:

public class StaticBlockDemo {
    public static String info;

    // 静态代码块:类加载时执行,用于初始化静态资源
    static {
        info = "静态代码块初始化";
        System.out.println("静态代码块执行");
    }

    // 构造方法
    public StaticBlockDemo() {
        System.out.println("构造方法执行");
    }

    public static void main(String[] args) {
        // 第一次创建对象:类加载→静态代码块→构造方法
        new StaticBlockDemo();
        // 第二次创建对象:只执行构造方法(静态代码块只执行一次)
        new StaticBlockDemo();
    }
}

执行结果:

静态代码块执行
构造方法执行
构造方法执行

使用场景:初始化静态变量、加载配置文件、注册驱动(如 JDBC 注册驱动)。

4. 静态内部类

用 static 修饰的内部类,叫静态内部类,是内部类中唯一可以用 static 修饰的类型。

特点:
  • 属于外部类本身,不依赖外部类对象;
  • 可以直接访问外部类的静态成员,不能直接访问外部类的实例成员;
  • 创建静态内部类对象无需创建外部类对象。

代码示例:

public class OuterClass {
    private static String outerStatic = "外部类静态变量";
    private String outerInstance = "外部类实例变量";

    // 静态内部类
    public static class StaticInnerClass {
        public void show() {
            // 正确:访问外部类静态成员
            System.out.println(outerStatic);
            // 错误:不能访问外部类实例成员
            // System.out.println(outerInstance);
        }
    }

    public static void main(String[] args) {
        // 直接创建静态内部类对象,无需创建外部类对象
        OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
        inner.show();
    }
}

使用场景:需要与外部类关联,但又不想依赖外部类对象的场景(如 HashMap 中的 Node 静态内部类)。

三、static 关键字内存机制(重点)

很多新手搞不懂 static,核心是没理解内存分配:

  • 实例成员:存储在堆内存,每个对象独有一份,创建对象时分配;
  • 静态成员:存储在元空间(JDK8+),随类加载而分配,所有对象共享一份;
  • 执行顺序:类加载 → 静态成员初始化 → 静态代码块执行 → 创建对象 → 普通代码块 → 构造方法。

四、static 使用注意事项

  • 禁止滥用 static:静态成员常驻内存,过多会占用资源,只有真正需要共享、通用的成员才用 static;
  • 静态方法无多态:静态方法属于类,重写不生效,调用时看引用类型;
  • 静态变量线程安全问题:多线程环境下修改静态变量,会出现线程安全问题,需要加锁;
  • 主方法是静态方法:main() 是程序入口,必须是 static,因为 JVM 启动时无需创建对象就能调用。

五、面试高频考点总结

  • static 修饰的成员属于类还是对象?答:属于类,不依赖对象。
  • 静态方法能不能访问非静态成员?为什么?答:不能,因为静态成员随类加载而存在,非静态成员随对象创建而存在,静态成员优先于对象,无法访问后创建的成员。
  • 静态代码块执行几次?什么时候执行?答:只执行一次,类加载时自动执行。
  • static 和 final 结合使用有什么效果?答:修饰常量(public static final),全局共享、不可修改,编译期确定值。
  • 静态方法能不能被重写?答:不能,静态方法属于类,重写基于对象多态,静态方法只有隐藏,没有重写。

六、总结

static 关键字的核心就是 **「属于类,共享,不依赖对象」**,记住这一句话,就能吃透所有用法:

  • 静态变量:共享数据,类名访问;
  • 静态方法:通用工具,无 this;
  • 静态代码块:初始化静态资源,只执行一次;
  • 静态内部类:不依赖外部类对象。

日常开发中,static 主要用于工具类、共享常量、初始化配置,掌握它不仅能写出更优雅的代码,还能轻松应对面试中的高频问题。

到此这篇关于Java中static关键字的用法与场景深入理解的文章就介绍到这了,更多相关Java中static关键字用法与场景内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javaweb实现文件上传示例代码

    javaweb实现文件上传示例代码

    这篇文章主要为大家详细介绍了javaweb实现文件上传的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • java实现分布式锁的常用三种方式

    java实现分布式锁的常用三种方式

    本文主要介绍了java实现分布式锁,一般有这3种方式,基于数据库实现的分布式锁、基于Redis实现的分布式锁和基于Zookeeper实现的分布式锁,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • Sharding-Proxy分库分表和数据加密使用场景分析

    Sharding-Proxy分库分表和数据加密使用场景分析

    这篇文章主要介绍了Sharding-Proxy分库分表和数据加密使用经验分享,通过场景模拟分析结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Java文件(io)编程之文件字符流使用方法详解

    Java文件(io)编程之文件字符流使用方法详解

    这篇文章主要为大家详细介绍了Java文件(io)编程之文件字符流使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Jetpack Room 使用示例详解

    Jetpack Room 使用示例详解

    Room 是 Android 开发中强大的持久化解决方案,它简化了 SQLite 的使用,提供了类型安全的数据库访问,并与 Android 架构组件深度集成,本文给大家介绍Jetpack Room 使用详解,感兴趣的朋友一起看看吧
    2025-04-04
  • 解决IDEA提示:MVC DispatcherServlet servlet context in module ssm. File is included in 4 contexts.问题

    解决IDEA提示:MVC DispatcherServlet servlet contex

    在SSM整合配置Spring时出现错误,需删除多余配置文件并重新导入,若属性解析失败,清除缓存重启IDEA,个人经验,供参考
    2025-08-08
  • SpringMVC配置、映射与参数处理​入门案例详解

    SpringMVC配置、映射与参数处理​入门案例详解

    文章介绍了SpringMVC框架的基本概念和使用方法,包括如何配置和编写Controller、设置请求映射规则、使用RestFul风格、获取请求参数等,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • RabbitMQ实现消费端限流的步骤

    RabbitMQ实现消费端限流的步骤

    消费者端限流的主要目的是控制消费者每次从 RabbitMQ 中获取的消息数量,从而实现消息处理的流量控制,这篇文章主要介绍了RabbitMQ如何实现消费端限流,需要的朋友可以参考下
    2024-03-03
  • centos 安装java环境的多种方法

    centos 安装java环境的多种方法

    本文给大家分享三种方法帮助大家安装jdk,有利用yum来安装jdk还有通过手动解压jdk的操作方法,每种方法给大家介绍的都非常详细,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • Java 深入理解创建型设计模式之抽象工厂模式

    Java 深入理解创建型设计模式之抽象工厂模式

    当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式,抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态
    2022-02-02

最新评论