Java static关键字详细解析
作者:haoyuhua??????? 发布时间:2021-08-12 00:40:23
static目的
java中的static关键字主要用于内存管理。
static范围
使用范围:java static关键字可以用在变量、方法、代码块和嵌套类中。
作用范围:static关键字属于类,而不是类的实例。
静态(static)修饰
变量、方法:称为类变量/方法、静态变量/方法;修饰变量或方法,表示这个变量/方法属于这个类,而不属于单个对象
代码块:称为静态代码块;修饰代码块,表示该代码块为静态代码块
嵌套类:称为静态内部类;修饰内部类,表示该类为静态内部类。可用于实现单例模式。
可用于修饰import,进行静态导包,导入类中所有静态方法。最常见的使用场景是在JUnit进行单元测试时。
静态变量
类的成员变量可以分为以下两种:
静态变量(或称为类变量),指被 static 修饰的成员变量。
实例变量,指没有被 static 修饰的成员变量。
静态变量与实例变量的区别如下:
1)静态变量
运行时,Java 虚拟机只为静态变量分配一次内存,加载类过程中完成静态变量的内存分配。
在类的内部,可以在任何方法内直接访问静态变量。
在其他类中,可以通过类名访问该类中的静态变量。
2)实例变量
每创建一个实例,Java 虚拟机就会为实例变量分配一次内存。
在类的内部,可以在非静态方法中直接访问实例变量。
在本类的静态方法或其他类中则需要通过类的实例对象进行访问。
静态变量在类中的作用如下:
静态变量可以被类的所有实例共享,因此静态变量可以作为实例之间的共享数据,增加实例之间的交互性。
如果类的所有实例都包含一个相同的常量属性,则可以把这个属性定义为静态常量类型,从而节省内存空间。例如,在类中定义一个静态常量 PI。
静态变量的好处:它能使程序存储器高效(即它节省内存)。
静态方法
同成员变量,成员方法也可以分为以下两种:
静态方法(或称为类方法),指被 static 修饰的成员方法。
实例方法,指没有被 static 修饰的成员方法。
静态方法与实例方法的区别:
静态方法,属于类,而不属于类的对象。
它通过类直接被调用,无需创建类的对象。
静态方法中,不能使用 this 关键字,也不能直接访问所属类的实例变量和实例方法;
静态方法中,可以直接访问所属类的静态变量和静态方法。
同this 关键字,super 关键字也与类的实例相关,静态方法中不能使用 super 关键字。
实例方法,可直接访问所属类的静态变量、静态方法、实例变量和实例方法。
静态方法与静态变量好处:
属于类级别,无需创建对象就即可直接使用,使用方便。
全局唯一,内存中唯一,静态变量可以唯一标识某些状态。
类加载时候初始化,常驻在内存,调用快捷方便。
静态方法与静态变量缺点:
静态方法不能调用非静态的方法和变量。
不能使用this和super关键字。
静态方法与静态变量适用场景:
静态方法,最适合工具类中方法的定义;比如文件操作,日期处理方法等。
静态方法,适合入口方法定义;比如单例模式,因从外部拿不到构造函数,所以定义一个静态的方法获取对象非常有必要。
静态变量适合全局变量的定义;举例:用一个布尔型静态成员变量做控制标志。
静态代码块
定义:静态代码块,是 Java 类中的 static{ } 修饰的代码。
作用:用于类初始化时,为类的静态变量赋初始值,提升程序性能。
静态代码块的特点如下:
静态代码块,有点类似于一个方法,但不可以存在于任何方法体内。
静态代码块,可以置于类中的任何地方,类中可以有多个静态初始化块。
Java 虚拟机在加载类时执行,将只需要进行一次初始化的操作放在 static 代码块。
类中含多个静态代码块,Java虚拟机将按它们在类中出现的顺序依次执行,且都执行一次。
同静态代码块与静态,不能直接访问类的实例变量和实例方法,需通过类的对象访问。
静态类
java中一个类要被声明为static的,只有一种情况,就是静态内部类(内嵌类)。如在外部类声明为static的,程序会编译都不会通过。
1、静态内部类,跟静态方法一样,只能访问静态成员变量和方法,不能访问非静态方法和属性。
2、普通内部类,可以访问任意外部类的成员变量和方法。
3、静态内部类,可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。
4、静态内部类,可以单独初始化。
可用于实现单例模式。
public class StaticSingleton {
/**
* 只有当显式调用getInstance()方法之后,这里的静态内部类SingletonHolder才会被加载
* 从而将INSTANCE初始化
* 因此,通过静态内部类实现的单例模式是懒汉式的
*/
private static class SingletonHolder { // 通过静态内部类持有实例
private static final StaticSingleton INSTANCE = new StaticSingleton();
}
private StaticSingleton() { } // 用private隐藏构造方法
public static StaticSingleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
static变量存储在方法区(Method Area)
方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间。
静态变量(static)、常量(final)、类信息(构造方法、接口定义)(Class)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关。
来源:https://juejin.cn/post/7135271586197667877


猜你喜欢
- 本文实例讲述了C#实现获取程序路径方法。分享给大家供大家参考。具体如下:获取DLL的目录:Assembly myAssembly = Ass
- 本文实例讲述了JavaMail实现发送超文本(html)格式邮件的方法。分享给大家供大家参考。具体如下:附件以超文本形式,很常用,与普通的邮
- 本文实例为大家分享了C#实现简单的计算器功能的具体代码,供大家参考,具体内容如下环境:VS2010及以上版本1、建立个Window窗体应用2
- 开门见山 项目运行的环境里面已经有该项目的所有代码依赖,所以项目的代码只要将自己的代码打入进去就能提交到环境中运行了。但是不好的地方就是项
- java字段值为null,不返回该字段类上打注解@JsonSerialize(include = JsonSerialize.Inclusi
- 本文实例为大家分享了Android App自动更新通知栏下载的具体代码,供大家参考,具体内容如下版本更新说明这里有调用UpdateServi
- 背景以springboot为tomcat启动的框架,以angular2为前端页面的框架,最后需要将angular2的代码运行在springb
- Android多点触控涉及到的知识点1、ScaleGestureDetector 2、OnScaleGestureListener 3、Ma
- 这篇文章主要介绍了SPRING IOC注入方式过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- .NET 4.5 中包含取消架构,允许以标准方式取消长时间运行的任务。每个阻塞调用都应支持这种机制。但目前,并不是所有阻塞调用都实现了这个新
- 在前面介绍的代码中有使用特性,这些特性都是Microsoft定义好的,作为.NET Framework类库的一部分,许多特性都得到了C#编译
- Condition是在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean操作。思考:SpringBoo
- 前言在数据库连接池分析的代码实例中,看到其中使用Enumeration来遍历Vector集合。后来就找了一些资料查看都有哪些方法可以遍历集合
- 1.登录腾讯云点击登录选择浏览器登录。输入用户名 按回车键 然后输入 密码。2.安装java环境直接命令:yum -y install ja
- 前一篇博文介绍了JDK logging基础知识 博文中也提到LogManager,本章主要阐述怎么完全定制化LogManager来
- Android Notification的多种用法总结我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏
- android开发中为activity增加左右手势识别,如右滑关闭当前页面。/* * for左右手势 *&n
- 本文实例讲述了C#检测是否有u盘插入的方法。分享给大家供大家参考。具体如下:该C#代码可监控是否有u盘插入,同时可以监控其它驱动器的变化us
- 1. Spring简介Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。2. Spring的优势 1.方便解耦, 简
- 关于死信队列在大多数的MQ中间件中,都有死信队列的概念。死信队列同其他的队列一样都是普通的队列。在RabbitMQ中并没有特定的“死信队列”