1、final关键字
final关键字可用于修饰类、方法以及变量。
修饰类:该类不能被继承,该类的所有方法和成员都被隐式地指定为final。
修饰方法:锁定方法,任何继承类都不能修改他,所有的private方法都被隐式地指定为final方法。
修饰变量:若修饰的变量为基本数据类型,该变量值被赋值后不可改变;若修饰的变量为引用类型的变量,该变量被初始化后不可再被定义指向另一个对象,但指向的对象的内容是可变的。
2、static变量
“全局”或者“静态”的意思,给类使用而不是给对象使用。
被static修饰的方法或变量,无须依赖对象实例去访问,只要类被加载了就可以通过类名直接去访问。原因:Java程序创建时,在类首次被加载时会优先执行static变量、方法或代码块,并为其分配固定的内存区域,JVM可以直接访问到他们,而不需要依赖某个特定的实例变量,并被类的所有实例共享。
修饰变量:静态变量被所有的对象所共享,在内存中只有一副本,当且仅当类初次加载时被初始化。
修饰方法:静态方法不依赖于任何对象就可以被访问,直接类名.方法名可以直接访问。因此,静态方法中不能访问非静态方法或非静态变量。工具类?
修饰代码块:同理,仅执行一次,提高代码效率。
注:static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变。
3、public/private/protected关键字
public修饰符:任何类都可以访问
private修饰符:访问权限仅限于类内部
protected修饰符:类及其子类或同一个包下的类可以访问
4、finally关键字
finally总是会被执行,正常在try语句后,抛异常在catch语句后,除非前序语句中有System.exit(0)。
finally中return会修改try或catch中return的变量值吗?
返回基本类型是值,返回引用类型是指向某个对象的地址;基础类型被分配在栈中,对象分配在堆中。如果返回的是基本类型,直接复制一个变量返回,finally块中的代码不会影响到返回结果;若返回值是引用类型,finally语句块可以修改其指向对象的值。
5、throw/throws关键字
throw 函数体,用于语句抛出异常,一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。
throws 函数头,用于方法可能抛出异常的申明,声明方法时跟上throws,交给上层处理抛出的异常。
6、transient关键字
一个对象实现了Serializable接口,该对象就会序列化。若是某些属性不希望被序列化(如密码),可以在该属性前加transient修饰。如此,该字段的生命周期仅存在于调用者的内存中而不会被写到磁盘中持久化。
静态变量不管是否被transient修饰都不会被序列化。
在Java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。
7、synchronized关键字
synchronized 同步锁,使用锁的机制实现同步。
修饰一个代码块,同步代码块,作用对象是调用这个代码块的对象,指定对象加锁。
修饰一个方法,同步方法,作用对象是调用这个方法的对象,当前实例加锁。
修饰一个静态方法,作用对象是这个类的所有对象,当前类对象加锁。
修饰一个类,作用对象是这个类的所有对象,当前类对象加锁。
两个并发进程访问同一个对象object中的synchronized(this)同步代码时,一个时间内只有一个线程得到执行,另一个线程必须等到该线程执行完该代码块才可以执行。
当一个线程访问一个对象object中的synchronized(this)同步代码时,另一个线程可以访问该object的非同步代码块。
当一个线程访问一个对象object中的synchronized(this)同步代码时,其他线程对该object对象中的其他同步代码块的访问也被阻塞。 对象锁
注:使用该关键字,需要注意是否是对同一个对象加锁,对于静态方法或者是类,该类的所有对象同一把锁。
8、volatile关键字
修饰变量
保证不同线程对于这个变量进行操作时的可见性,即一个线程修改了该变量的值,该新值对于其他线程是立即可见的。如果是写操作,会导致其他CPU中对应的缓存行无效,需要到主存中读取该变量的值。
禁止进行指令重排序。
加入volatile关键字会多一个lock前缀指令,相当于一个内存屏障,可以保证指令重排序不会穿过屏障。
强制将对缓存的修改操作立即写入主存。