
简介static是 Java 后端面试超级高频考点很多人分不清静态和非静态的区别。本篇大白话讲清 static 四种用法、内存分布、常见报错直接给出业务代码使用原则附带面试背诵要点。前言写 Java 代码到处都能看见 staticpublic static void main(String[] args)程序入口就带 static。 不少同学只会复制粘贴搞不懂为什么静态方法不能直接调用普通方法static 变量什么时候初始化static 和对象是什么关系核心一句话static 修饰的内容属于类不属于对象所有对象共享同一份静态资源。一、static 修饰静态变量静态变量也叫类变量。 普通成员变量每 new 一个对象就会生成一份独立副本各个对象互不干扰。 static 静态变量归属于类全局只有一份所有 new 出来的对象共用这一份数据在方法区存放。代码示例public class Student { //普通成员变量每个对象自己独有 private String name; //静态变量所有对象共享 public static String school 延边大学; public Student(String name){ this.name name; } public void showInfo(){ System.out.println(姓名name 学校school); } }public class TestMain { public static void main(String[] args) { Student s1 new Student(小明); Student s2 new Student(小红); s1.showInfo(); s2.showInfo(); //通过任意对象修改static变量全部对象都会受影响 Student.school 吉林大学; s1.showInfo(); s2.showInfo(); } }调用静态变量规范推荐直接类名.静态变量不建议使用对象调用。⚠️坑点static 变量随着类加载初始化优先于对象创建。二、static 修饰静态方法静态方法又叫类方法。使用方式类名.静态方法()不需要 new 对象就能直接调用重点规则 静态方法中不能直接访问非静态成员变量、不能直接调用普通成员方法。 反过来普通成员方法可以随便调用静态变量、静态方法。public class Demo { private String name 张三; //静态方法 public static void staticFunc(){ // System.out.println(name); //编译报错静态方法不能直接访问实例变量 } //普通实例方法 public void normalFunc(){ staticFunc(); //普通方法可以直接调用静态方法完全没问题 } }为什么会报错大白话解释static 方法执行的时候对象可能还没有 new 出来。实例变量是依附对象存在没有对象根本找不到实例变量。 main 方法为什么加 static程序启动还没有创建任何对象JVM 直接调用 main 方法启动程序。三、static 修饰静态代码块格式static { }执行时机类被加载的时候自动执行只执行一次早于构造方法。 作用做类初始化工作加载配置、初始化静态资源。public class StaticBlockDemo { static { System.out.println(静态代码块执行类加载的时候执行只跑一次); } { System.out.println(实例代码块每次new对象都会执行); } public StaticBlockDemo(){ System.out.println(构造方法执行); } public static void main(String[] args) { new StaticBlockDemo(); new StaticBlockDemo(); } }执行顺序静态代码块优先执行 1 次之后每次 new 执行实例代码块再执行构造方法。四、静态内部类简单了解面试常提static 修饰内部类叫做静态内部类。 不需要外部类对象就可以直接创建静态内部类对象单例模式经常会用到。五、static 和 final 组合拓展承接上一篇 finalstatic final常量全局常量程序运行期间不能修改一般大写命名public static final int MAX_NUM 100;static final 变量赋值时机声明直接赋值 / 静态代码块赋值六、对比表格类型归属调用方式执行时机实例变量 / 实例方法对象必须 new 对象调用创建对象之后static 静态变量 / 静态方法类类名直接调用也可对象调用类加载阶段早于对象七、开发怎么选直接记结论如果数据是所有对象共用一份定义 static 静态变量工具类方法不需要对象状态直接写成 static 方法不要滥用 staticstatic 变量常驻内存不用也不会回收滥用容易内存泄漏常量统一使用public static final变量名大写静态方法不要访问实例成员编译直接报错。八、面试简答背诵版static 修饰的成员属于类所有对象共享加载类的时候初始化静态方法不能直接访问实例变量和实例方法实例方法可以访问静态静态代码块类加载自动执行仅执行一次用于初始化静态资源static final 代表常量不要滥用 static容易内存泄漏。思考题静态代码块、实例代码块、构造方法new 对象的时候三者执行顺序是什么