当前位置: 首页 > article >正文

Java static 关键字从浅入深

文章目录前言一、static 的基本概念1.1 static 修饰什么1.2 static 的一句话理解二、static 变量2.1 类变量与实例变量2.2 使用场景三、static 方法3.1 静态方法的特点3.2 使用场景四、static 代码块4.1 static 代码块什么时候执行4.2 初始化顺序五、static 内部类5.1 静态内部类5.2 使用场景六、static 与内存模型6.1 static 存在哪里6.2 类加载与初始化6.3 线程安全思考七、项目中如何使用 static7.1 推荐使用7.2 谨慎使用八、面试如何考察 static8.1 高频问题8.2 回答思路总结前言static是 Java 里非常常见的关键字。它的核心意思是这个成员属于类而不是属于某一个对象。如果把类比作一张“设计图”对象就是按设计图造出来的一台台机器。普通字段是每台机器自己的零件static字段则像挂在工厂墙上的公共看板所有机器看到的是同一份。一、static 的基本概念1.1 static 修饰什么static可以修饰变量、方法、代码块、内部类。常见形式publicclassDemo{staticintcount;staticvoidhello(){System.out.println(hello);}static{System.out.println(class init);}staticclassHelper{}}不能直接修饰普通外部类也不能修饰局部变量。1.2 static 的一句话理解普通成员依赖对象static成员依赖类。所以普通成员通常用对象.成员访问静态成员通常用类名.成员访问。二、static 变量2.1 类变量与实例变量被static修饰的变量叫类变量。它在类加载后只有一份被这个类的所有对象共享。实例变量属于对象每 new 一次就有一份。classUser{staticinttotal;Stringname;User(Stringname){this.namename;total;}}这里name是每个用户自己的名字total是所有用户共同维护的总人数。2.2 使用场景static变量适合存放“全班共享”的数据。常见场景publicclassAppConfig{publicstaticfinalStringAPP_NAMEdemo;}publicclassCounter{privatestaticinttotal;publicCounter(){total;}}适合放常量、计数器、共享配置、缓存引用。不适合放用户登录状态、请求参数、订单数据等会因对象或线程变化而变化的数据。三、static 方法3.1 静态方法的特点静态方法属于类可以不创建对象直接调用。Math.max(1,2);Integer.parseInt(123);静态方法中不能直接访问非静态字段因为它执行时不一定有对象。classDemo{Stringname;staticvoidtest(){// System.out.println(name); // 编译错误}}原因很简单你站在工厂办公室里能看公共看板但不能知道某一台机器里私有零件的状态除非你拿到那台机器的引用。3.2 使用场景静态方法适合无状态工具方法。publicclassStringUtils{publicstaticbooleanisBlank(Stringvalue){returnvaluenull||value.trim().isEmpty();}}如果方法强依赖对象状态就不要写成static。四、static 代码块4.1 static 代码块什么时候执行静态代码块在类初始化时执行并且一个类只执行一次。classDemo{static{System.out.println(load Demo);}}常见触发时机包括创建对象、访问静态字段、调用静态方法、反射加载类。4.2 初始化顺序大致顺序是类加载 - 静态字段赋值和静态代码块 - 实例字段和实例代码块 - 构造方法静态内容先于对象存在。它像工厂开门前先装好的公共设备对象只是后面生产出来的产品。五、static 内部类5.1 静态内部类静态内部类不依赖外部类对象。classOuter{staticclassHelper{}}Outer.HelperhelpernewOuter.Helper();普通内部类依赖外部类对象。classOuter{classInner{}}OuterouternewOuter();Outer.Innerinnerouter.newInner();5.2 使用场景静态内部类常用于把辅助类收在外部类内部表达“它只服务于这个外部类”的关系。经典用法是 Holder 单例publicclassSingleton{privateSingleton(){}privatestaticclassHolder{privatestaticfinalSingletonINSTANCEnewSingleton();}publicstaticSingletongetInstance(){returnHolder.INSTANCE;}}它利用类初始化的线程安全特性实现懒加载和安全发布。六、static 与内存模型6.1 static 存在哪里很多旧资料会说static变量在方法区。更准确地说类的元数据在方法区的实现中HotSpot 从 JDK 8 开始使用元空间保存类元数据而静态字段的实际存储与类对象相关底层实现细节和 JVM 版本有关。学习时可以先记住static成员和类生命周期绑定不和某个实例对象绑定。6.2 类加载与初始化Java 类从被 JVM 认识到可使用会经历加载、验证、准备、解析、初始化等阶段。对static来说重点是准备阶段会给静态变量分配默认值。初始化阶段会执行显式赋值和static代码块。staticintcount10;准备阶段count 0。初始化阶段count 10。6.3 线程安全思考static变量是共享的共享就可能有并发问题。privatestaticintcount;publicstaticvoidadd(){count;}count不是原子操作多线程下可能丢失更新。项目中可用AtomicInteger、锁、不可变对象或者避免共享可变静态状态。七、项目中如何使用 static7.1 推荐使用推荐用于常量publicstaticfinalintMAX_RETRY3;推荐用于无状态工具方法publicstaticStringnormalize(Stringvalue){returnvaluenull?:value.trim().toLowerCase();}推荐用于 Holder 单例privatestaticclassHolder{privatestaticfinalServiceINSTANCEnewService();}7.2 谨慎使用谨慎使用可变静态变量。publicstaticListStringusersnewArrayList();它容易带来全局状态污染、测试互相影响、线程安全问题和难以追踪的数据变化。项目经验里static最大的问题不是不会用而是用得太方便。八、面试如何考察 static8.1 高频问题常见问题static变量和实例变量区别是什么static方法能不能访问普通成员static代码块什么时候执行类加载初始化顺序是什么static final和普通static有什么区别静态内部类为什么能实现单例静态变量线程安全吗8.2 回答思路先讲归属static属于类普通成员属于对象。再讲生命周期static随类加载初始化普通成员随对象创建初始化。再讲访问限制静态上下文没有this不能直接访问实例成员。最后讲项目风险共享可变状态要注意并发和测试污染。总结static的本质是“属于类而不是属于对象”。用得好它可以表达常量、工具方法、类级共享资源和单例结构用得不好它会变成全局变量制造并发问题和测试污染。记住一句话能不共享就不共享必须共享就尽量不可变如果共享可变状态就要认真考虑线程安全和生命周期。

相关文章:

Java static 关键字从浅入深

文章目录前言一、static 的基本概念1.1 static 修饰什么1.2 static 的一句话理解二、static 变量2.1 类变量与实例变量2.2 使用场景三、static 方法3.1 静态方法的特点3.2 使用场景四、static 代码块4.1 static 代码块什么时候执行4.2 初始化顺序五、static 内部类5.1 静态内部…...

FFmpeg硬件加速全解析:从原理到实战的跨平台优化指南

1. 项目概述:为什么我们需要深入理解FFmpeg硬件加速?在音视频处理的世界里,FFmpeg无疑是那把无所不能的“瑞士军刀”。无论是转码、剪辑、流媒体还是滤镜处理,它几乎无所不能。然而,随着4K、8K乃至更高分辨率内容的普及…...

2026企业招聘平台选择趋势:前程无忧成为多类型岗位招聘的重要平台

相比只聚焦某一类岗位或单一人群的招聘平台,前程无忧更像一个覆盖企业全生命周期招聘需求的“综合人才生态平台”。从基层岗位招聘,到中高端人才寻访;从校园招聘,到灵活用工与AI智能匹配,前程无忧正在凭借28年行业积累…...

一文搞懂MCP、Skill、Agent

理清AI大模型三大高阶概念:MCP、Skill、Agent 在现代AI工程体系中,随着大模型能力的爆发增长,围绕“AI工具化”和“AI自动化”的需求持续升级。MCP、Skill、Agent 是其中极为关键但又容易混淆的核心概念。掌握它们,不仅对AI开发者…...

ESP8266 AT指令连接阿里云物联网平台,我踩过的那些坑(附client_id转义完整解决方案)

ESP8266 AT指令连接阿里云物联网平台的实战避坑指南 当ESP8266遇上阿里云物联网平台,本该是物联网开发的黄金组合,却总在AT指令的细节处暗藏杀机。记得第一次用ATMQTTUSERCFG配置客户端时,那个带着逗号的client_id让我在深夜的实验室里对着串…...

新手创业是注册公司好还是注册个体户好?

很多刚准备创业的朋友,最先纠结的问题就是:我到底是注册个体工商户,还是直接注册有限公司?一、先搞懂最核心的本质区别个体户属于个人经营模式,承担无限连带责任,简单说就是生意出问题,个人资产…...

JavaScript进阶:ES6+特性与异步编程

JavaScript进阶:ES6特性与异步编程 1. 技术分析 1.1 ES6概述 ES6为JavaScript带来了革命性的改进: ES6特性变量声明: let, const箭头函数: () > {}解构赋值: const {a, b} obj类: class语法模块化: import/export异步编程:Promiseasync/awaitGenerat…...

实在Agent架构实战:彻底化解工厂员工入转调离流程繁琐与HR行政超负荷困局

摘要: 站在2026年这个数字化深水区的节点,制造企业正面临前所未有的管理韧性挑战。工厂员工入转调离流程繁琐已不再仅仅是行政效率问题,而是演变为制约企业规模化扩张与人力成本控制的战略瓶颈。传统数字化手段往往受困于系统烟囱、老旧OA/ER…...

软件开发项目中,如何做好需求沟通与交付管控

在软件项目里,需求沟通与交付管控是决定项目成败的关键环节。很多看似复杂的技术难题,追根溯源都能找到需求理解偏差、交付节奏失控的影子。结合日常项目经验,我梳理了几个关键要点,希望能给同行们一些参考。一、需求沟通&#xf…...

2026年数字人拍摄新方式:一条视频能省多少时间

2026年数字人拍摄新方式:一条视频能省多少时间 【导语】 做视频最耗时间的是什么?不是拍摄那几分钟,而是前期的准备工作。但现在有一种新方式,可以让你完全不用拍摄真人,一条视频从准备到成片,最快只要7分钟…...

HarmonyOS 6 ArkGraphics 3D精讲:从旋转立方体看鸿蒙原生3D能力

HarmonyOS 6 ArkGraphics 3D精讲:从旋转立方体看鸿蒙原生3D能力 前言:从数字孪生到鸿蒙 3D 大家好,我是你们老朋友木斯佳,熟悉我的朋友们知道,我长期从事物联网、数据可视化相关开发。过去几年里,我在各种平…...

开关电源功率因数校正:从谐波失真到PFC电路设计实践

1. 项目概述:从“相移”到“失真”,理解开关整流器的功率因数挑战在通信、数据中心乃至我们日常使用的各类开关电源适配器中,高频开关整流器是电能转换的核心。作为一名电源工程师,我经常被问到:“为什么我们设备的输入…...

5分钟快速上手:Parsec VDD虚拟显示器完整指南,彻底释放游戏串流潜能

5分钟快速上手:Parsec VDD虚拟显示器完整指南,彻底释放游戏串流潜能 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 想要在没有物理显示器的情况下畅享4K游…...

影刀RPA跨境店群自动化实战:Python协同Chromium底层调度与容器化环境隔离系统架构

定了。在这场旷日持久的跨境电商反爬风控拉锯战中,我们终于用一套基于 Python 深度协同的分布式微服务调度架构,重塑了跨境千店矩阵的自动化底座。 这几天,科技圈被“DeepSeek V4 首发华为昇腾芯片,国产 AI 开始打破英伟达 CUDA …...

手把手教你用Verilog在FPGA上实现Sobel边缘检测(附完整Matlab图片转TXT流程)

从图像到硬件加速:FPGA实现Sobel边缘检测全流程实战指南 在计算机视觉领域,边缘检测作为基础预处理步骤,直接影响着后续特征提取和目标识别的精度。传统基于CPU的算法实现往往难以满足实时性要求,而FPGA凭借其并行计算能力和低延迟…...

工业网络零中断的秘密:手把手教你理解并配置PRP协议(基于IEC 62439-3)

工业网络零中断的秘密:手把手教你理解并配置PRP协议(基于IEC 62439-3) 在钢铁厂轧机轰鸣的生产线上,或是高铁信号控制系统的毫秒级响应中,任何网络中断都意味着数百万损失甚至安全事故。传统冗余技术如RSTP需要秒级收敛…...

当 SpringBoot 请求踏上“七层之旅”:OSI 模型与你的每一行代码

你在 Controller 里写了一个 GetMapping,浏览器敲下回车,数据就回来了。 可你有没有想过,这短短几十毫秒里,你的数据经历了多少次“变装”和“安检”? 从 HTTP 报文到 TCP 段,再到 IP 包、以太网帧——每一…...

Taotoken在应对大模型API服务波动时的路由与容灾机制体验

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken在应对大模型API服务波动时的路由与容灾机制体验 1. 背景与观测场景 在开发实践中,我们时常会遇到依赖的某个…...

探索罗技鼠标宏:掌握PUBG压枪技术的完整路径

探索罗技鼠标宏:掌握PUBG压枪技术的完整路径 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 在《绝地求生》这款竞技性极强的射击游戏…...

卡尔曼滤波在目标跟踪中的应用:原理、建模与工程调参实战

1. 项目概述:从“猜”到“算”的跟踪艺术在目标跟踪这个领域,无论是自动驾驶中预测前车的轨迹,还是无人机锁定移动的物体,亦或是视频监控里框住一个行走的人,我们核心要解决的都是一个问题:如何在充满噪声和…...

赶Due救急必看!从飙红到安全线:5款降AI工具红黑榜与免费指令微调法

为了找到真正靠谱的解决方案,我过去测试了市面上大部分号称能降低ai率的方法。从一分钱不花的模型指令,到各种付费的专业降ai率工具,用手头的文本做了几十次实操对比。说心里话,里面套路确实不少,有些方法用完后语句颠…...

Arduino步进电机控制:按键调速与定时器中断实现

1. 项目概述与核心需求解析最近在捣鼓一个自动化小装置,核心需求就是通过几个物理按键来控制步进电机的动作,比如正转、反转、加速、减速或者停止。这听起来像是很多创客项目、小型自动化设备或者教学演示里最基础的一环。我猜你可能是电子爱好者、学生&…...

别再乱删C盘文件了!手把手教你用任务管理器和命令行精准清理流氓软件残留

别再乱删C盘文件了!手把手教你用任务管理器和命令行精准清理流氓软件残留 每次打开电脑看到C盘飘红的存储空间,不少用户的第一反应就是打开资源管理器,对着那些看不懂的文件夹和文件按下删除键。这种简单粗暴的操作轻则导致软件异常&#xf…...

告别Chrome依赖:在Edge上完美复刻XPath Helper,打造你的爬虫元素定位工作流

告别Chrome依赖:在Edge上完美复刻XPath Helper,打造你的爬虫元素定位工作流 浏览器工具链的迁移从来不是简单的插件替换,而是一场关于开发习惯与效率的深度重构。当微软Edge凭借Chromium内核的稳定性和内存优化逐渐成为技术工作者的新宠&…...

手把手教你用Obsidian+Excalidraw画流程图,告别切换软件的麻烦

手把手教你用ObsidianExcalidraw画流程图,告别切换软件的麻烦 每次写技术文档时,最让我头疼的就是画流程图。原本思路清晰,一打开绘图软件就卡壳——要么是工具太复杂,要么是画完图还要导出再插入笔记,来回切换几次灵感…...

NAFNet实战指南:无激活函数图像修复模型的深度解析与应用

NAFNet实战指南:无激活函数图像修复模型的深度解析与应用 【免费下载链接】NAFNet The state-of-the-art image restoration model without nonlinear activation functions. 项目地址: https://gitcode.com/gh_mirrors/na/NAFNet NAFNet(Nonline…...

Java WebSocket六种集成方案详解:从JSR 356到Spring生态实战

1. 项目概述最近在折腾一个基于 Spring Cloud 的 WebSocket 集群方案时,我不得不把 Java 生态里那些五花八门的 WebSocket 集成方式都翻了个底朝天。不研究不知道,一个看似简单的 WebSocket,在 Java 世界里竟然有这么多“门派”,从…...

基于CMS8S6990评估板实现高精度电压电流测量:从血氧仪到通用测量工具的移植实践

1. 项目缘起与核心思路最近终于拿到了中微半导体(CMSemicon)正版的CMS8S6990血氧仪开发板。这块板子给我的第一印象就是“精致”,尺寸不大,但该有的接口和功能一应俱全,颇有点“麻雀虽小,五脏俱全”的味道。…...

从VOC到YOLO:用Labelimg标注后,一键转换数据格式的完整避坑指南

从VOC到YOLO:数据格式转换的工程化实践与避坑指南 当你用Labelimg完成目标检测任务的标注工作,看着满屏的XML文件,是否觉得离模型训练还差"最后一公里"?这恰恰是许多初学者从标注到训练的关键断裂点。本文将带你深入VOC…...

Sitara处理器PRU-ICSS架构解析:工业自动化信息传输系统设计实战

1. 项目概述:工业自动化中的信息传输挑战与Sitara方案在工业自动化领域,信息传输的实时性、可靠性与灵活性,直接决定了生产线的“智商”与“反应速度”。想象一下,一条高速运转的汽水装瓶线,如果无法在毫秒级内感知到原…...