static
static可以用来修饰 类 /方法/ 类变量/ static代码块 。
从JVM的类加载机制的角度讲,静态资源是类初始化的时候加载的,而非静态资源是类new的时候加载的。
一、static类/方法/变量
static修饰类
static修饰方法
静态方法,方法是属于类的,可以通过类名.方法名访问。
-
场景:想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。
-
在静态方法中不能访问类的非静态成员变量/非静态成员方法。(在非静态成员方法中是可以访问静态成员方法/变量的)
-
静态方法和静态变量都存在方法区的并且整个 JVM 只有一份
static修饰变量
类变量,变量是属于类的,可以通过类名.变量名访问。
-
场景:全局变量,无论单例还是多例该变量都需要全局共享。
-
类变量、实例变量
-
类变量:在类中定义,使用static修饰。类变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化
-
实例变量:在类中直接定义,没有static修饰。实例变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
-
-
-
service标注的类默认单例,只有一个对象
-
当类是多例时,每次new都会新增一个对象,这时static标注的类变量被不同对象共享,非static标注的实例变量是对象内共享的,对象间不共享。
-
-
static不允许用来修饰局部变量。
总结
把同一类事物抽象为类,类有属性/方法;类实例化为对象,对象也有自己的属性/方法。
静态变量它是属于类的,而非属于实例对象的属性;同样的静态方法也是属于类的,普通方法(实例方法)才属于对象。而Spring容器管理的都是实例对象,包括它的@Autowired依赖注入的均是容器内的对象实例,所以对于static成员是不能直接使用@Autowired注入的。这很容易理解:类成员的初始化较早,并不需要依赖实例的创建,所以这个时候Spring容器可能都还没“出生”,谈何依赖注入呢?
二、类变量、成员变量 、局部变量
类变量:声明在类中,方法体之外的变量,但必须声明为static类型
-
private static int a;
-
生命周期:随着类的加载而存在,随着类的消失而消失
-
存储位置:方法区(共享数据区)的静态区,所以也叫对象的共享数据
成员变量:声明在类中,方法体之外的变量
-
private int a;
-
生命周期:随着对象的创建而存在,随着对象的回收而释放
-
存储位置:堆内存的对象中,所以也叫对象的特有数据
局部变量:声明在方法内部
-
int a;
-
生命周期:作用的范围结束,变量空间会自动释放
-
存储位置:栈内存中
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~