static
- static方法:静态方法,不依附与对象,可以直接通过类来获取使用。由于这个特性,静态方法不能调用非静态方法或成员变量,因为这两者都依附于对象。 而非静态方法可以调用静态成员变量或方法。
- static变量:静态变量,被所有对象共享,类初次加载的时候被初始化。而非静态变量在创建对象的时候被初始化。
- static代码块:可以用来优化程序性能,原因:因为静态代码块只会在类初始化的时候执行一次,按static的顺序的执行。
- static内部类:静态内部类可以拥有静态成员,只能访问外部类的静态成员。静态内部类创建方式与非静态内部类创建方式不同。//假设类A有静态内部类B和非静态内部类C,创建B和C的区别为: A a=new A(); A.B b=new A.B(); A.C c=a.new C();
- static导包:将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便
final
- final类:该类不可被继承,final类的成员方法被隐式的指定为final方法,final类中的成员变量可根据情况是否final修饰。
- final方法:禁止子类对该方法的修改。
- final变量:如果是基本数据类型的变量,则值不能改变。如果是引用类型的变量,那么该引用不能改变,大师对象本身可以改变。
transient
- 被transient修饰过后的变量,不再是对象持久化的一部分
- transient只能修饰变量,不能修饰方法或和类。本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
- 被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化
- 注意:对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关
Volatile
- 内存可见
- 禁止重排
- 不能保证原子性
- 实现的原理:加入volatile后,汇编代码会多出一个lock的前缀指令,该指令保证了禁止重排,强制更新主内存,其他CPUT对应的缓存失效