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 前缀指令, 相当于一个内存屏障, 可以保证指令重排序不会穿过屏障.
强制将对缓存的修改操作立即写入主存.
来源: http://www.bubuko.com/infodetail-3100269.html