先言在先
工作中或多或少在学习东西,也总是一直在遗忘,有些事情不努力开个头,就不会去做。所以这就来开个头,这几年下来了,才知道,坚持才是王道。
复习,自然从最基础的复习咯,那么首先就是关键字。
Static关键字
这个关键字可以说是极为常用的。
- 修饰方法
- 修饰变量
不管方法也好,变量也罢,它都能够修饰,并且被修饰的变量或者方法属于这个类的,在类被加载的时候存储到方法区中,只会加载一次,之后大家都共享这个变量或方法,所以,直接用类.成员变量/方法就能够成功使用。
- 静态代码块
静态代码块就是被static关键字修饰的代码块,形如
static{
System.out.println("静态代码块");
}
那么类在被加载的时候,只会执行一次这个代码块,主要目的是为了优化程序性能,你想啊,你总不能每次生成个对象都要加载一遍相同的代码。
代码加载顺序:
静态代码块>非静态代码块>构造器
- 静态内部类
静态内部类,顾名思义,是静态+内部组合体,首先明白什么是内部类,内部类指的是与外部类有一定的联系,只有此外部类调用此内部类,所以就没必要再多写一个Java类,这就是内部类。静态就不必多说了,以上描述中有。那么静态内部类,就是说这个类没必要搞一个Java类并且可以直接被外部类.内部类进行访问。
- 静态导包
静态导包就是直接import static …,这样你使用的时候就直接用此类的方法而不用写一长串了,当然了,这适用于要写很多重复调用的时候。
Final关键字
这个关键字比较简单,主要是修饰的类不能被继承,修饰的方法不能被重写。
修饰成员变量的时候,表示常量,存在于方法区的常量池中,赋值后不再改变,即如果是基本数据类型,数据值不会改变,如果是对象类型,那么对象引用地址不会被改变,对象中的内容还是可以改变的。
Transient关键字
被此关键字标记的成员变量不参与序列化过程。
序列化与反序列化:实现Serializable接口的Java类,在对数据进行1、字节持久化时(存储数据库,写文件),2、网络传送,需要对数据进行序列化与反序列化,含有此关键字的字段不参与序列化。实现Serializable接口的Java类一定要指定serialVersionUID,以此来确定序列化的版本,一旦改动会引起序列化失败的场景。
Volatile关键字
这个关键字还挺厉害的,主要作用于两个方面:
可见性/一致性
即某个线程修改了某个变量的值,另外一个线程能够知道并且获取最新的值。
主要是利用了缓存一致性协议来保障,即线程的处理器在总线上嗅探其内部缓存中的内存地址在其他处理器的操作情况,一旦嗅探到某处处理器打算修改其内存地址中的值,并且该内存地址刚好也在自己的内部缓存中,就会强制让该缓存地址失效,等下次读取的时候到主存中访问。
有序性
在Java代码编译过程中,虚拟机对代码进行重排序,重排序后对变量的值不会有影响,但可能会产生线程安全问题。
而如果一个变量被声明为Volatile的,那么这个变量一定不会重排序,也就是说在它之前的代码一定比它先执行,在它之后的代码一定比它后执行。