《Java 100 天进阶之路》第33篇:Java中的static关键字详解

C语言static关键字详解:从内存模型到模块化设计 在C语言编程中,变量的生命周期、作用域和链接属性是理解内存管理与程序结构的基础概念。生命周期决定了变量存在的时间,作用域定义了其可见范围,而链接属性则影响多文件编译时的符号解析。static关键字通过改变变量的存储类别,能够将局部变量的生命周期从自动延长为静态,使其在函数调用间保持状态;同时,它能将全局变量和函数的链接属性从外部改为内部,实现信息隐藏和模块封装。这种机制在工程实践中价值显著,既能用于实现函数内的持久化状态(如计数器、缓存),又能构建清晰的模块接口,避免命名冲突。本文聚焦于static在C语言 阅读详情

第33篇:Java中的static关键字详解

📌 系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第32篇:Java常用工具类(Objects、Collections、Arrays深入) |
➡️ 下一篇:第34篇:Java序列化与反序列化详解


一、核心知识点

  • 静态变量(类变量):所有实例共享,类加载时初始化
  • 静态方法(类方法):只能访问静态成员,可直接类名调用
  • 静态代码块:类加载时执行一次,用于初始化静态资源
  • static 在 JVM 中的内存分配(方法区 / 元空间)
  • 静态导入(import static)

二、通俗讲解(1分钟开心学)

1. static 的含义

static 表示“属于类而不是实例”。被 static 修饰的成员随着类加载而存在,不需要创建对象即可访问。

2. 静态变量(类变量)

所有对象共享一份数据。常用于计数、单例模式中的 instance、配置常量等。

3. 静态方法(类方法)

工具类中常用,比如 Math.sqrt()、Collections.sort()。静态方法中不能直接使用 this 和非静态成员(因为可能还没有对象)。

4. 静态代码块

在类加载时自动执行一次,常用于加载驱动、初始化静态资源等。可以多个,按顺序执行。

5. 静态导入

import static java.lang.Math.PI; 可以直接写 PI 而不需要 Math.PI,但滥用会降低可读性。

6. 内存位置

静态变量存储在方法区(JDK8 以后叫元空间),而不是堆中。

生活类比:
静态变量就像公司里的“公告栏”,所有人都能看到同一份内容,修改后所有人都看到变化。
实例变量就像每个人自己的工位,每个人有自己的物品。

三、实操代码案例 + 场景说明

场景:统计某个类被创建了多少个对象,并提供一个工具方法。

public class StaticDemo {
    // 静态变量:所有实例共享,计数
    private static int instanceCount = 0;
    
    // 静态常量
    public static final double PI = 3.14159;
    
    // 实例变量
    private String name;
    
    public StaticDemo(String name) {
        this.name = name;
        instanceCount++;   // 每创建一次,计数+1
    }
    
    // 静态方法:获取创建了多少个实例
    public static int getInstanceCount() {
        return instanceCount;
    }
    
    // 静态代码块:类加载时执行一次
    static {
        System.out.println("类 StaticDemo 被加载,执行静态代码块");
        // 可以在这里加载配置、驱动等
    }
    
    // 实例方法
    public void show() {
        System.out.println("实例:" + name);
    }
    
    public static void main(String[] args) {
        new StaticDemo("A");
        new StaticDemo("B");
        System.out.println("总共创建了 " + StaticDemo.getInstanceCount() + " 个对象");
        System.out.println("圆周率:" + StaticDemo.PI);
    }
}

// 静态导入示例
import static java.lang.System.out;
import static java.lang.Math.*;

public class StaticImportDemo {
    public static void main(String[] args) {
        out.println("Hello");          // 直接写 out,省略 System.
        double result = sqrt(pow(3, 2) + pow(4, 2));  // 不用 Math.
        out.println("斜边长:" + result);
    }
}

四、避坑要点

错误/误区后果正确做法
静态方法中尝试使用 this编译错误静态方法中不能使用 this
静态变量多线程环境下不加同步计数不准、线程安全问题使用 synchronized 或 AtomicInteger
误以为静态代码块可以抛出非运行时异常而不处理编译错误用 try-catch 包裹
静态方法被子类重写(其实不能,只能隐藏)调用时还是父类的实现理解:静态方法没有多态,调用看引用类型

五、面试高频考点

Q1:static 变量和方法的内存分配在哪?

在方法区(JDK8 前永久代,JDK8+ 元空间),随类加载而分配,类卸载而释放。

Q2:静态代码块和实例代码块的区别?

静态代码块在类加载时执行一次;实例代码块在每次创建对象时执行,且优先于构造方法。

Q3:能否在静态方法中访问非静态变量?为什么?

不能,因为非静态变量属于具体对象,静态方法调用时可能还没有任何对象存在。

六、练习题

  1. 设计:编写一个 Logger 类,包含一个静态方法 log(String msg),每次调用时打印时间戳和消息,并统计调用次数。
  2. 代码分析:写出以下代码的输出。
    class Test {
        static { System.out.print("A "); }
        { System.out.print("B "); }
        Test() { System.out.print("C "); }
    }
    public class Main { public static void main(String[] args) { new Test(); new Test(); } }
    
  3. 动手:使用静态导入简化 System.out.println 和 Math.sqrt 的调用,写一个小程序。

📊 你的学习进度

  • 当前:第33篇 / 共44篇 · 第五阶段:工具类、异常最佳实践、序列化(第32~35篇)
  • ✅ 已完成:第1~32篇
  • 📖 正在学:第33篇
  • ⏳ 待学习:第34~44篇

👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇

💡 本专栏每篇都包含:避坑表 + 面试高频考点 + 练习题。每天30分钟,100天拿offer!


👉 下一篇文章预告

《第34篇:Java序列化与反序列化详解》

内容简介:Serializable接口、transient关键字、serialVersionUID的作用、反序列化安全风险。

💡 学完这篇,你将掌握对象的持久化存储,面试再问serialVersionUID轻松回答。

📌 《Java 100 天进阶之路 | 从入门到上岗就业》 每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!
📌 除了Java,我也在深挖智能物流实战(出版社WMS、托盘调度、机器学习落地)。如果你对技术在不同领域的实战感兴趣,欢迎点击我的头像,看看专栏《出版社物流WMS智能调度实战》。技术相通,思路可鉴。

STM32 FOC电机控制:手把手教你用CubeMX配置TIM1中心对齐PWM(含代码避坑) 本文详细解析了STM32 FOC电机控制中TIM1中心对齐PWM的配置方法,涵盖CubeMX图形化设置、HAL库代码调用及常见问题排查。特别针对L6230Q驱动芯片的使能逻辑和死区时间配置提供实用指南,帮助开发者高效实现无刷电机的高性能控制。 阅读详情

相关推荐

【Rcode】生存分析: KM & COX回归& 随机森林& nomogram

本文使用了R——survival包下的lung数据进行方法测试: 1)KM 2) Cox回归:多因素 3)随机森林因子(根据cox回归结果) 4)nomogram ( 根据cox回归结果,建立了中位生存时间,1年5年生存率的概率计算) -------------------????????‍♀️本文只有干货,非常干!????----------------------------- 一、数据加载 #生存分析 library("survival") library("survminer") data("

weixin_43172152的博客 9268

《2026全新 | Java 100 天进阶之路:从零基础到上岗就业,108篇完整学习地图》

摘要:不背八股文,不堆概念。44篇基础 + 64篇进阶(共108篇),100天助你达到Java就业水平,从容面对技术面试。 👉 零基础入门 / 校招社招突击 / 1-3年Java后端提升 / 想系统复盘全栈知识的开发者。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 9583

高速窄脉冲峰值保持设计

一、目的 在激光探测领域,探测器发出的高速窄脉冲,单片机AD进行采样,很难捕捉到窄脉冲的幅值,即使使用高速AD进行采样,也存在一定的难度。因此,本方案设计了一种高速窄脉冲峰值保持电路,有助于单片机AD采样能很好的捕捉到脉冲幅值。 二、方案分析与比较 峰值保持器一般分为两种:电压型和跨导型。 方案一:电压型峰值保持器,由电压型运放、二极管、保持电容、缓冲器组成,优点是元件成本低,缺点是峰值保持存在过...

weixin_43184208的博客 9267

Java static 关键字详解

静态成员是Java类的共享资源,通过static关键字修饰变量、方法、代码块和内部类。静态成员属于类而非实例,类加载时初始化,可直接通过类名访问。静态变量被所有对象共享,常用于计数器等场景;静态方法只能访问静态成员,适合工具类;静态代码块在类加载时执行一次;静态内部类不依赖外部类实例。使用static import可简化静态方法调用。注意静态方法不能直接访问实例成员,需通过对象引用。合理使用static能优化内存并简化代码结构。

m0_53543414的博客 1110

从外包到转正:一个华为OD亲历者的真实工作体验与避坑指南

本文分享了一位华为OD员工从外包到转正的真实经历与实用建议。通过详细解析华为OD的日常工作、转正核心指标、机试备考技巧及职场突围策略,为读者提供了一份全面的避坑指南。特别针对机试E卷的高频考点和刷题方法,给出了具体的数据分析和实战经验。

weixin_33686714的博客 678

sldd数据字典导出为excel

sldd导出为excel

zpfjf的博客 2229

Kettle实战100篇(天)

在数据仓库技术中,ETL是必不可少,Kettle作为ETL的经典工具,已经得到广大ETL工程师的喜爱,甚至连开发工程师在使用ETL过程中,优先考虑的也是Kettle 目前国内关于Kettle的资料很少,本着学习的态度,在使用和学习Kettle的过程中,将整个学习过程整理成博客,分享给大家,一方面是希望能对Kettle的使用有一个更深入的了解,另外也同大家一起来学习这款优秀的ETL工具.记录下自己的...

八一菜刀的专栏 1万+

PSCAD学习笔记(1)Project Settings(重点snapshot设置)

若不勾选,则横坐标为实际时间2-7s,故障显示在第3s发生。图片中时间坐标轴显示为0-5s,故障时刻显示为第1s,即0-1s展示系统稳态,1-5s展示系统发生故障后的暂态响应,如何通过快照文件实现?勾选该项后,使用快照文件启动仿真会将仿真起始时间强制设置为0s,反之不勾选则依据快照文件保存的时间轴继续(即坐标为实际时间)。如果已有的快照文件保存的是0s至5s的仿真内容,则仿真运行时间从5s开始,到10s结束。如果已有的快照文件保存的是0s至2s的仿真内容,则仿真运行时间从2s开始,到7s结束;

gwenh的博客 7335

《Java 100 天进阶之路》第34篇:Java序列化与反序列化详解

本文详细讲解了Java序列化与反序列化的核心概念和使用方法。主要内容包括:序列化将对象转为字节流便于存储传输,反序列化将字节流恢复为对象;通过实现Serializable接口使类可序列化;使用transient关键字跳过敏感字段序列化;serialVersionUID保证版本兼容性;提供了用户对象序列化的完整代码示例;指出了常见错误和安全隐患;解答了面试高频问题。文章强调要显式定义serialVersionUID,避免反序列化不可信数据,并提供了练习题巩固知识点。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 583

深入理解梅尔刻度、梅尔滤波器组和梅尔时频谱图

读取一段音频,使用短时傅里叶变换,得到普通的时频谱图,然后绘制梅尔滤波器组,值得注意的是,librosa的梅尔滤波器组函数还带有权重归一化功能,即对一个三角形滤波器的每个权重,都除以该三角形的面积,如果不希望进行该归一化,设置参数。从公式可见,对数部分可以以自然对数为底数,也可以以10为底数,不同的底数对应不同的系数,要确定当前的系数,只需要代入(1000Hz, 1000mel)即可。其中,m是当前滤波器的序号,表征了当前的时间段,k是当前频率的序号,表征了当前正在对哪一频率的。

DEDSEC_Roger的博客 1万+

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

丨汀、的博客 510

Java关键字(二)static关键字(static声明属性)

static关键字: a、使用static与非static属性声明的区别? b、static声明的属性或方法可以直接由类名称调用 c、static方法只能访问static声明的属性或方法,不能访问非static d、静态代码块是用static声明的代码块,以及他的执行顺序是怎样的 1、Java中常用的内存区域 (1)栈内存:保存所有的对象名称(保存引用的堆内存空间的地址);由编译器自动

yels303的专栏 2489

Python 爬虫实战:全面解析雪球网用户投资组合数据采集

本文介绍了如何使用 Python 爬虫技术,抓取雪球网用户的投资组合信息。通过模拟登录、解析页面内容等步骤,获取了用户的持仓数据。未来,可以进一步探索以下方向:

2201_76125261的博客 1296

[Java]学习笔记33:static

一旦使用了static关键字,那么这样的内容就不再属于对象自己,而是属于类的,所以凡是本类的对象,都共享一份。 static修饰成员变量 用static修饰学号,每new一个对象,学号id就+1 Student.java public class Student { private String name; private int age; private static int id; static int room; public Student(){} .

weixin_46285081的博客 121

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java关键字final、static使用总结

假如一个变量存在于一个函数中,函数调用结束后,普通变量会被释放内存。 而静态变量的内存则不会释放。 假如后面的程序段要调用该函数,该函数中该静态变量的值可以继续使用。 一、final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。 final类不...

alnh4952的博客 62

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《Java 100 天进阶之路》第9篇:Java运算符简介

本文介绍了Java运算符的核心知识点,包括算术、赋值、比较、逻辑、位运算等七类运算符。重点讲解了除法运算的整数特性、逻辑运算符的短路机制、位运算的高效操作,以及三元运算符的简化用法。通过计算器案例演示了运算符的实际应用,并提供了常见错误避坑指南和面试高频考点解析。文章最后设置了3道练习题帮助巩固知识,预告下一篇将深入讲解Java操作符的完整清单和使用规则。全文采用通俗易懂的语言和实用代码示例,适合Java初学者快速掌握运算符的核心用法。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 679

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java基础总结——常用的关键字解析(this,super,instanceof,final,static)

一、this关键字  this是一个引用,它指向自身的这个对象。看内存分析图:  假设我们在堆内存new了一个对象,在这个对象里面你想象着他有一个引用this,this指向这个对象自己,所以这就是this,这个new出来的对象名字是什么,我们不知道,不知道也没关系,因为这并不影响这个对象在内存里面的存在,这个对象只要在内存中存在,他就一定有一个引用this。上面的代码分析:第一句Leaf leaf...

abingR的博客 470

java学习笔记:java所有关键字汇总、解析及应用

汇总所有java关键字及其用途,并举例说明。

超哥量化的博客 3167

java调用finalstatic变量_Java关键字final、static使用总结

一、final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。final类不能被继承,没有子类,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。final不能用于修饰构造...

weixin_42569429的博客 220

《Java 100 天进阶之路》第67篇:JVM面试压轴题(2026版)

摘要:JVM调优专题收官之作!精选 35+ 道大厂高频JVM面试题,覆盖7大模块:内存区域(五大运行时区、堆栈区别、元空间vs永久代)、垃圾回收(6款回收器、G1原理、ZGC、引用类型)、GC调优(四步闭环、核心参数、FullGC排查)、类加载器(双亲委派、打破双亲委派、热部署)、JIT编译(分层编译5层级、逃逸分析、方法内联)、OOM排查(5种OOM类型、五步排查流程、核心工具链)。附3道面试官追问陷阱+4道练习题。JVM面试,一篇通关!

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1218

java关键字 static

static关键字: a、使用static与非static属性声明的区别? b、static声明的属性或方法可以直接由类名称调用(用非static声明的属性和方法只能是实例化对象来调用,不能直接用类名来调用其属性或方法。这样如果一个属性或方法经常使用就不用实例化对象了,直接通过类名来调用了。不用一遍遍创建对象,提高了效率) c、static方法只能访问static声明的属性或方法,不能访问非

程序猿的博客 424

java搜索关键字_利用Java实现文件中的关键字查询

1 package com.sinsoft.fileSearch;23 import java.io.BufferedReader;4 import java.io.File;5 import java.io.FileFilter;6 import java.io.FileNotFoundException;7 import java.io.FileOutputStream;8 import ja...

weixin_35510737的博客 3469

《Java 100 天进阶之路》第89篇:MySQL面试压轴题(2026版)

摘要:覆盖存储引擎、事务MVCC、锁机制、SQL优化与工具链、高可用架构、分库分表等 45+ 道高频面试题。深度剖析 InnoDB vs MyISAM、MVCC 原理、死锁排查、深分页优化,并新增 AI 辅助慢 SQL 诊断、Optimizer Trace / 直方图调优、云原生 Serverless 数据库选型 等 2026 前沿视角。每个考点配套标准话术 + 加分回答 + 实战经验。面试突击,这一篇就够了。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 4634

Java中的static修饰int值做全局变量与static修饰词初始化顺序

先看一道题 1 public class HasStatic{ 2 private static int x=100; 3 public static void main(String args[]){ 4 HasStatic hs1=new HasStatic(); 5 hs1.x++; 6 HasStatic hs2=ne...

weixin_30402343的博客 715

Java基础学习 100 问

Java基础学习 100 问 来源: 赢在面试( [Java知音](javascript:void(0)????) 一、Java基础篇 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。 2、Java有没有goto? java中的保留字,现在没有在java中使用。 3、说说&和&am...

ronmy的专栏 5349

Java8特性之'::' 关键字

Java8中提供了::,使我们可以直接访问类的构造函数,静态函数,对象函数。 首选我们构造一个类Product public class Product { private long id; private String name; private BigDecimal price; public Product(){} public Product(...

m13797378901的博客 3627
上一篇: Java常用工具类大揭秘:Objects、Collections、Arrays,开发效率翻倍!(2026版)
下一篇: 《Java 100 天进阶之路》第34篇:Java序列化与反序列化详解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值