JAVA知识基础(四):深入理解static关键字
1、static存在的主要意义
static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法!
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
2、static的独特之处
被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享。
在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。
static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!
被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。
3、static 关键字主要使用场景
static 关键字主要有四种使用场景
- 修饰成员变量和方法
- 静态代码块
- 修饰类【只能修饰内部类也就是静态内部类】
- 静态导包
下面是详细介绍
4、修饰成员变量和成员方法(常用)
被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。
方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
HotSpot 虚拟机中方法区也常被称为 “永久代”,本质上两者并不等价。仅仅是因为 HotSpot 虚拟机设计团队用永久代来实现方法区而已,这样 HotSpot 虚拟机的垃圾收集器就可以像管理 Java 堆一样管理这部分内存了。但是这并不是一个好主意,因为这样更容易遇到内存溢出问题。
调用格式:
类名.静态变量名
类名.静态方法名()
如果变量或者方法被 private 则代表该属性或者该方法只能在类的内部被访问而不能在类的外部被方法。
5、静态代码块
静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—非静态代码块—构造方法)。 该类不管创建多少对象,静态代码块只执行一次.
一个类中的静态代码块可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果静态代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问.
静态代码块通常用来对静态变量进行一些初始化操作,比如定义枚举类,还有我们熟悉的单例模式同样也用到了静态代码块
6、静态内部类
静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。
没有这个引用就意味着:
它的创建是不需要依赖外围类的创建。
它不能使用任何外围类的非static成员变量和方法。
代码举例(静态内部类实现单例模式):
public class Singleton {// 声明为 private 避免调用默认构造方法创建对象private Singleton() {}// 声明为 private 表明静态内部该类只能在该 Singleton 类中被访问private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getUniqueInstance() {return SingletonHolder.INSTANCE;}
}
当 Singleton 类加载时,静态内部类 SingletonHolder 没有被加载进内存。只有当调用 getUniqueInstance()方法从而触发 SingletonHolder.INSTANCE 时 SingletonHolder 才会被加载,此时初始化 INSTANCE 实例,并且 JVM 能确保 INSTANCE 只被实例化一次。
这种方式不仅具有延迟初始化的好处,而且由 JVM 提供了对线程安全的支持。
7、静态导包
静态导包格式:import static
这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法
静态导包在书写代码的时候确实能省一点代码,可以直接调用里面的静态成员,但是会影响代码可读性,所以开发中一般情况下不建议这么使用。
8、静态变量和实例变量
static修饰的成员变量叫做静态变量【也叫做类变量】,静态变量是属于这个类,而不是属于是对象。没有被static修饰的成员变量叫做实例变量,实例变量是属于这个类的实例对象。java规定static是不允许用来修饰局部变量的。
静态变量和实例变量的区别
静态变量:静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。
实例变量:每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。
访问静态变量和静态方法的两种方法:
静态变量:
类名.静态变量
对象.静态变量(不推荐)
静态方法:
类名.静态方法
对象.静态方法(不推荐)
静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问【只要访问权限足够允许就行】。
this也是可以访问static的变量的!
9、static静态方法
static修饰的方法也叫做静态方法,其实我们最熟悉的static静态方法就是main方法。
由于对于静态方法来说是不属于任何实例对象的,this指的是当前对象,因为static静态方法不属于任何对象,所以就谈不上this了。
还有一点就是:构造方法不是静态方法!
x.static注意事项:
1、静态只能访问静态。
2、非静态既可以访问非静态的,也可以访问静态的。
JAVA知识基础(四):深入理解static关键字相关推荐
- Java基础:详解static关键字与类加载顺序
1. 前言 前文中说到了static关键字,在Java中这是一个很重要的关键字,它有很多的用法,并且在某些特定的情况下使用可以优化程序的性能.本文学习static关键字的应用场景.在这之前了解变量的类 ...
- 【Scala教程】如何在已掌握的Java知识基础上快速上手Scala?【个人学习记录】
如何在已掌握的Java知识基础上学习Scala 前言 正文开始! 1. 编译运行 2. 声明变量 3. 输出 4. 显式指定变量类型 5. 范围区间 6. 写入文本文件 7. 读取文本文件 8. if ...
- java基础提升篇:Static关键字
Static变量 static关键字 在类中用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时初始化,对于该类的所有对象来说,static成员变量只有一份. 可以通过引用或 ...
- java final static_Java基础之final、static关键字
一.前言 关于这两个关键字,应该是在开发工作中比较常见的,使用频率上来说也比较高.接口中.常量.静态方法等等.但是,使用频繁却不代表一定是能够清晰明白的了解,能说出个子丑演卯来.下面,对这两个关键字的 ...
- java基础第十七课----static关键字
在<Java编程思想>当中有这样一段话: "static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下, ...
- JAVA知识基础(三):修饰符
JAVA中根据修饰对象的不同可以分为类修饰符.方法修饰符.变量修饰符三类,其中每种修饰符又可以单独分成两类:访问修饰符和非访问修饰符.为了便于理解,本文以访问和非访问的角度展开. 1.访问修饰符 访问 ...
- 深入理解static关键字
文章目录 1.static存在的主要意义 2.static的独特之处 3.static应用场景 4.静态变量和实例变量的概念 5.静态变量和实例变量区别[重点常用] 6.访问静态变量和实例变量的两种方 ...
- java入门基础(四)
文章目录 (一)对象和类 封装概述: (二)String对象 (三)StringBuilder对象 (四)集合ArrayList:可变的存储模型 练习 ArryayList练习 (一)对象和类 类:类 ...
- java 静态代码块 作用域_java static关键字和代码块
static关键字 为什么需要学习static关键字? 针对某一个变量属于类而不属于某一个具体的对象的时候,我们可以考虑使用static关键字 static概述: 多个对象共享同一份数据 static ...
最新文章
- 浅析:seo工程师擅长的网站数据分析
- python画圣诞树代码-python圣诞树代码
- php sql漏洞修复,php sql注入漏洞与修复
- Redis集群理论知识
- Applese 走迷宫
- boost::math模块通过 Gauss 和 Gauss-Kronrod 正交的数值积分
- 选择排序与冒泡排序的区别
- jar包是什么意思_面试难度五颗星:JVM有Full GC,为什么还会 OutOfMemoryError?
- CSS3实现烟花特效 --web前端
- ffplay分析 (音视频同步:主时钟为音频)
- java 垃圾回收 新生代_Java垃圾回收
- oracle错误01653,oracle 10g 错误 ORA 01653 的解决过程
- 联想服务器万全T260G3系统,联想万全T260G3服务器电子教室更易管理
- GCN使用的数据集Cora、Citeseer、Pubmed、Tox21格式
- 成都Uber优步司机奖励政策(2月22日)
- IE无法打开二级页面
- 社群就是微信群吗?社群的本质是什么?
- 第三届“网鼎杯”官方资格赛圆满结束,问鼎之战即将开启!
- 【课程复习】Java Web、框架及项目简单回顾
- ECMAScript6常用语法
热门文章
- Qt中UDP通信的简单示例
- Python locals 函数 - Python零基础入门教程
- 计算机的复数英语怎么读,英语的复数怎么读
- Linux怎么把目录设置群组,linux设置目录和文件使用权限
- mysql为什么选innodb_为什么现在的MySQL都要使用innoDB引擎-Go语言中文社区
- 里能嵌jquery吗_白芸豆里的淀粉阻断成分,能帮助减肥是真的吗?
- 正面管教php_中联重科团委快乐父母协会第五期正面管教家长基础班招募!
- java 抽象类_什么是final?Java抽象类又是什么?抽象类能使用 final 修饰吗?
- python画同心圆程序_Python Turtle:使用circle()方法绘制同心圆
- android 8三星note8,信息太多很烦琐?告诉你三星Note8有妙招