Java关键字是对Java编译器有特殊意义的标识符,有时又叫保留字,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。(注意:关键字一律小写。)
修饰符是关键字的子集,是用来修饰类、方法、变量的。
修饰符分为两类:
- 访问控制修饰符 (public protected,default,private)
- 非访问修饰符 (static,final,abstract,synchronized,transient,volatile)
访问权限表:
类常用修饰符:
名称 | 说明 | 注意 |
public | 可以被所有类访问 | 一个java文件中可以包含多各类,但是有且只有一个类用public修饰并且此类名必须和java文件名相同 |
default(package) | 可以被同一个包中的类访问 | 默认的访问权限,可以省略此关键字 |
final | 使用此修饰符的类不能够被继承 | |
abstract | 抽象类 |
注意:内部类在成员的位置上,可以使用任何访问修饰符修饰。
变量常用修饰符:
Java变量分为:成员变量、类变量、方法局部变量。方法局部变量不能使用访问修饰符。
名称 | 说明 | 注意 |
public | 可以被任何类访问 | |
protected | 可以被同包的类和所有子类访问 | |
private | 只能够被当前类的方法访问 | |
default(package) | 可以被同一包中的所有的类访问 | 如果子类没有在同一个包中,也不能访问 |
static | 类变量 | 不能修饰方法局部变量 |
final | 常量,只能赋值一次不可更改 | |
transient | 告诉编译器,在类的对象序列化时,此变量不需要持久保存 | |
volatile | 指出可能有多个线程改变此变量,要求编译器优化以保证对变量的修改能够被正确处理 |
方法常用修饰符:
方法的基本定义格式: 访问修饰符 修饰符 返回值类型 方法名(参数列表) throws exception{}
名称 | 说明 | 注意 |
public | ||
protected | ||
private | ||
default(package) | ||
static | 静态方法 | |
final | 子类不能重写(override),跟重载(overload)扯不上关系 | |
synchronized |
接口常用修饰符:
接口的定义本身就是为了被实现,访问修饰符只能是package和default。
Java常用关键字用法:
static:
static不能修饰局部变量,静态变量属于全类共有(在JVM方法区存储一份),不是属于某一个对象。静态变量又叫类变量,可以用类名来访问静态变量,也可以用对象来访问静态变量。
静态变量是在加载类的时候就进行初始化的,而局部变量是初始化是在分配内存时进行初始化的。
静态方法只能访问静态属性和静态方法,普通方法是某一个对象的行为,静态方法是类的方法,所以不能用静态方法来访问非静态方法。但是静态的方法和变量可以被任意访问。
静态方法中不能出现this和super这类关键字(静态变量只能通过类名”点“来访问)。非静态方法只能覆盖非静态方法。静态方法只能覆盖静态方法(但是,这个时候就没有多态了)。
静态语句块:比构造函数还要早执行,并且只执行一次。
final:
可以用来声明成员变量、方法、类以及本地变量。
一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。
final声明在方法上,该方法不可被子类重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。
使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。
使用final关键字的好处:
- final关键字提高了性能。JVM和Java应用都会缓存final变量。
- final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
- 使用final关键字,JVM会对方法、变量及类进行优化。
关于final的重要知识点:
- final关键字可以用于成员变量、本地变量、方法以及类。
- final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
- 你不能够对final变量再次赋值。
- 本地变量必须在声明时赋值。
- 在匿名类中所有形参都必须是final变量。
- final方法不能被重写。
- final类不能被继承。
- 接口中声明的所有变量本身是final的。
- final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
- final方法在编译阶段绑定,称为静态绑定(static binding)。
- 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
- 将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。
- 按照Java代码惯例,final变量就是常量,而且通常常量名要大写。
transient:
我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。
然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。(测试了一下fastjson 将对象转化成字符串 然后再将字符串转化成对象 加了transient的字段不会被序列化)
总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
transient使用小结:
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化(静态变量的取值是JVM中存储的值 不是序列化之后的值)。
abstract:
abstract可作用在方法和类上。
有抽象方法的类一定是抽象类。抽象类不一定有抽象方法。抽象类中可以有抽象的方法,也可以有具体的方法。抽象类中也可以没有抽象方法。抽象类不能进行实例化,只能被子类继承,从而创建子类对象,抽象类被继承的时候,子类必须实现抽象类中的所有抽象方法(抽象方法后面没有花括号),若子类中有没有实现的抽象方法则子类也必须声明为抽象类。
日常开发中感觉:抽象类的作用就是抽象出来一写模板方法供子类们继承。
常用关键字表格:
关键字 | 含义 |
abstract | 表明类或者成员方法具有抽象属性 |
assert | 断言,用来进行程序调试 |
boolean | 基本数据类型之一,布尔类型 |
break | 提前跳出一个块 |
byte | 基本数据类型之一,字节类型 |
case | 用在switch语句之中,表示其中的一个分支 |
catch | 用在异常处理中,用来捕捉异常 |
char | 基本数据类型之一,字符类型 |
class | 声明一个类 |
const | 保留关键字,没有具体含义 |
continue | 回到一个块的开始处 |
default | 默认,例如,用在switch语句中,表明一个默认的分支 |
do | 用在do-while循环结构中 |
double | 基本数据类型之一,双精度浮点数类型 |
else | 用在条件语句中,表明当条件不成立时的分支 |
enum | 枚举 |
extends | 表明一个类型是另一个类型的子类型,这里常见的类型有类和接口 |
final | 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量 |
finally | 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块 |
float | 基本数据类型之一,单精度浮点数类型 |
for | 一种循环结构的引导词 |
goto | 保留关键字,没有具体含义 |
if | 条件语句的引导词 |
implements | 表明一个类实现了给定的接口 |
import | 表明要访问指定的类或包 |
instanceof | 用来测试一个对象是否是指定类型的实例对象 |
int | 基本数据类型之一,整数类型 |
interface | 接口 |
long | 基本数据类型之一,长整数类型 |
native | 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的 |
new | 用来创建新实例对象 |
package | 包 |
private | 一种访问控制方式:私用模式 |
protected | 一种访问控制方式:保护模式 |
public | 一种访问控制方式:共用模式 |
return | 从成员方法中返回数据 |
short | 基本数据类型之一,短整数类型 |
static | 表明具有静态属性 |
strictfp | 用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范 [1] |
super | 表明当前对象的父类型的引用或者父类型的构造方法 |
switch | 分支语句结构的引导词 |
synchronized | 表明一段代码需要同步执行 |
this | 指向当前实例对象的引用 |
throw | 抛出一个异常 |
throws | 声明在当前定义的成员方法中所有需要抛出的异常 |
transient | 声明不用序列化的成员域 |
try | 尝试一个可能抛出异常的程序块 |
void | 声明当前成员方法没有返回值 |
volatile | 表明两个或者多个变量必须同步地发生变化 |
while | 用在循环结构中 |