标识符、关键字、直接量
1. 标识符
标识符就是用于给程序中变量、类、方法命名的符号,Java语言的标识符是以字母开头并由字母或数字构成的序列。
需要注意的是,与大多数程序设计语言相比,Java中“字母”和“数字”的范围更大。
- 字母包括
'A'~'Z', 'a'~'z', '_', '$'
等在某种语言中表示字母的任何Unicode字符,数字同样。 - 如果想要知道哪些Unicode字符属于字母,可以使用
Character
类的isJavaIdentifierStart
和isJavaIdentifierPart
方法来检查。
Java 9规定,不允许使用单独的下划线_
作为标识符,不过将来的版本可以使用_
作为通配符。
声明一个(局部)变量后,必须用赋值语句对变量进行显式初始化,千万不要使用未初始化的变量的值。例如,Java编译器认为下面的语句是错误的:
int vacationDays;
System.out.println(vacationDays); // ERROR--variable not initialized
2. 关键字
Java共包含50个关键字,所有的关键字都是小写的:

保留字(reserved word) :goto
和const
这两个关键字也叫做保留字,这意味着Java目前还未使用这两个关键字,但未来可能使用。
native
native
修饰方法,表明其方法体由非 Java 代码实现的方法,其 Java 代码定义中方法体为空,定义语法有点像 abstract
方法,但绝不是 abstract
方法。
A native method is a Java method whose implementation is provided by non-java code.
public class Object {
// ...
public final native Class<?> getClass();
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
// ...
}
strictfp
strictfp
即 strict float point (精确浮点),可修饰类、接口、方法。
- 使用
strictfp
关键字声明一个方法时,该方法中所有的float
和double
表达式都严格遵守FP-strict的限制,符合IEEE-754规范。 - 当对一个类或接口使用
strictfp
关键字时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着所有表达式的结果都必须是 IEEE 754 算法对操作数预期的结果,以单精度和双精度格式表示。
transient
transient
:英文含义为“n. 瞬态、瞬变;adj. 转瞬即逝的,暂时的”。
在 Java 中此关键字修饰成员变量,用来表示被修饰的成员属性变量不被序列化。
transient
修饰的变量,在反序列化后变量值会被置成类型的默认值。static
变量因为不属于任何对象,所以不管是否被transient
修饰,均不能被序列化。
volatile
volatile
:见volatile-关键字。
3. 直接量
直接量(literal) ,指在程序中通过源代码直接给出的值,如int a = 5
,其中为变量a分配的初始值5就是一个直接量。此外,true, false, null
,这3个特殊的标识符也是3个特殊的直接量,程序员自定义的标识符也不能使用这3个词。
并不是所有的数据类型都可以指定直接量,能指定的通常只有三种类型:
- 基本类型
- String类型
- null类型
关于字符串直接量有一点需要指出,当程序第一次使用某个字符串直接量时,Java会使用 常量池(constant pool) 来缓存该字符串直接量,如果程序后面的部分需要用到该字符串直接量时,Java会直接使用常量池中的字符串直接量。
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据,它包括关于类、方法、接口中的常量,也包括字符串直接量。
String s0 = "hello";
String s1 = "hello";
String s2 = "he" + "llo";
System.out.println(s0 == s1); // true
System.out.println(s0 == s2); // true