一、static
① 修饰成员变量。修饰类的属性和方法,变成类的所属,而不是对象的所属,即多个对象只会对应一个static修饰的成员变量。
② 修饰成员方法。可以使用 类名.方法名 来调用方法,避免new出对象的繁琐和资源消耗。
③ 静态块。在创建对象时,static修饰的成员会首先被初始化,如果有多个,就会按照先后位置依次进行初始化。static修饰类成员,在程序运行时,只初始化一次。当初始化static修饰的成员时,可以统一放在:
static{
//这就是静态块
}
④ 静态导包。一个java文件导入另一个java类时,使用static。例如:import static com.psbc.order.*;导入之后,在不与当前类的方法名冲突的情况下,直接采用“方法名”去调用类方法。
二、final
① 修饰数据。final修饰的变量只进行一次赋值操作,final修饰数据值不可变,因此在使用前对成员变量赋值,只能在声明该成员时赋值,或者在构造方法中赋值。
② 修饰方法中的参数。表示在整个方法中,该参数的值不能改变。
③ 修饰方法。final修饰的方法表示该方法不能被覆盖,类中所有的private方法都隐式地指出是final的,由于无法再类外使用private,所以无法覆盖它。
④ 修饰类。final修饰的类无法被继承。
注:③④在开发中很少用到。
三、transient
只能修饰变量,不能修饰方法和类。
transient关键字修饰的变量不在被序列化,静态变量不能被序列化。不被序列化主要是为了节省存储空间。序列化后会将对象编程字节序列,这个字节序列包含了对象的数据信息,存入数据库或文件中。序列化的最终目的是反序列化,恢复成原先的对象。transient关键字的作用就是让被修饰的成员变量不被序列化。
四、volatile
volatile关键字修饰的变量存在于主内存中,线程对变量的操作也是在主内存中,因此是易变的,不稳定的。
将volatile关键字修饰的变量存于主内存,保证线程之间变量的可见性,线程读取该变量时,必须去主内存获取最新的值。
① volatile修饰的变量具有内存可见性。线程A对volatile变量的修改,其他线程获取的volatile变量都是最新的。
② 可以禁止指令重排。为了减少内存操作速度远慢于cpu运行速度所带来的cpu空置的影响,虚拟机会按照自己的一些规则将程序编写顺序打乱。如果变量没有volatile修饰,程序执行的顺序可能会进行重新排序。
五、synchronized
java内置锁,线程进入同步代码块或方法时会自动获取该锁,退出时会释放该锁。 获得内置锁的唯一办法就是进入这个锁的保护的同步代码块或方法中。
java内置锁是互斥锁,最多只能一个线程获得。synchronized修饰方法和修饰代码块。synchronized只是内置锁的一个加锁机制,当一个方法加上synchronized关键字后,就说明要获得该内置锁才能执行。
当线程执行synchronized修饰的代码出现异常时,其所持有的锁会自动释放,从而其他线程可以再次争夺锁的使用权而非一直等待造成死锁。
如果父类被synchronized关键字修饰,那么线程执行父类代码会同步,但是同步并不会继承给其子类,调用子类的方法仍然是异步的。
六、instanceof
归属于。运行时指出对象是否是某个特定类的一个实例,返回一个boolean值。
用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
但是instanceof在Java的编译状态和运行状态是有区别的:
在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。