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;

  • 生命周期:作用的范围结束,变量空间会自动释放

  • 存储位置:栈内存

参考资料

https://www.cnblogs.com/swisszhang/p/9892992.html

https://www.cnblogs.com/dolphin0520/p/3799052.html

posted @   zhegeMaw  阅读(157)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示