在Java里有50个关键字和3个保留字,它们不仅限定开发者不能使用这些来作为代码中的标识(这些标识指包(package)名、类(class, interface, enum)名、方法(method)名、变量(variable, field, parameter)名),同时它们对代码也有控制作用。本文就对这些关键字做一些归类分组,让大家更好的了解它们的作用。
Group | Category | Keyword |
---|---|---|
类型 Types |
原始类型 Primitive Type |
boolean |
byte | ||
char | ||
double | ||
float | ||
int | ||
long | ||
short | ||
void | ||
类相关 Class Type |
class | |
enum | ||
interface | ||
特殊引用 Special Reference |
super | |
this | ||
结构 Structure |
类结构 Class Struture |
extends |
implements | ||
instanceof | ||
new | ||
包相关 Package |
import | |
package | ||
修饰符 Modifier |
访问修饰符 Access Modifier |
private |
protected | ||
public | ||
基础修饰符 Basic Modifier |
abstract | |
final | ||
native | ||
static | ||
strictfp | ||
synchronized | ||
transient | ||
volatile | ||
控制 Control |
流程控制 Flow Control |
case |
default | ||
do | ||
else | ||
for | ||
if | ||
switch | ||
while | ||
流程中断 Flow Interruption |
break | |
continue | ||
return | ||
异常处理 Exception Handling |
assert | |
catch | ||
finally | ||
throw | ||
throws | ||
try | ||
特殊保留 Reserved |
文字值 Literal Value |
null |
true | ||
false | ||
未使用 Not Used |
const | |
goto |
数据类型对应的类(Class of Data Type)
Java是一门面向对象的语言,对象需要由类来创建出来,所以对于关键字所指定的数据类型,在Java的库中基本都能找到对应的类。
Type | bits | Class Type |
---|---|---|
boolean | undefined(true/false) | Boolean |
byte | 8 | Byte |
char | 16 | Character |
double | 64 | Double |
float | 32 | Float |
int | 32 | Integer |
long | 64 | Long |
short | 16 | Short |
void | – | Void |
class | – | Class<T> |
enum | – | Enum<E extends Enum<E>> |
interface | – | – |
void
其实并不是基础类型(primitive type),Java代码中从来都不能声明void
类型的变量。但它和其它基础类型一样有着对应的Java类用在反射和泛型中。再者在C/C++中也有空指针(void *
)这样的类型,所以将其作为一种受限制的基础类型也未尝不可。
用类限定的特殊引用(Class Modified Reference)
this
代表当前对象的引用,super
用于调用父类中的成员。值得一提的是对于它们的使用还可以加上类名作为前缀来限定:
[codesyntax lang=”java” lines=”normal”]
public class Main { void method() { System.out.println(Main.this.toString()); System.out.println(Main.super.toString()); } @Override public String toString() { return "Category of Java Keywords"; } public static void main(String[] args) { new Main().method(); } } // Output: // Category of Java Keywords // Main@40f186b8
[/codesyntax]
一般情况下,在同一个对象内部引用成员其实连this
都不用加上去作为限定,所以加上类名限定更是冗余。但是当使用嵌套类(Nested Classes)的使用,类名限定就非常有用了,只有通过它才能消除内部类引用了有同名冲突的外部成员的问题。
[codesyntax lang=”java” lines=”normal”]
public class Main { Inner inner = new Inner(); class Inner { void method() { System.out.println(this.toString()); System.out.println(Main.this.toString()); } } public static void main(String[] args) { new Main().inner.method(); } } // Output: // Main$Inner@30c3bb57 // Main@24065c4
[/codesyntax]
此外,class
除了用来定义类,同时也是一种特殊引用,只是它必须用类名做限定。
[codesyntax lang=”java” lines=”normal”]
public class Main { public static void main(String[] args) { System.out.println(Main.class); System.out.println(new Main().getClass()); } } // Output: // class Main // class Main
[/codesyntax]
通过此引用可获得类相应的Class<T>
对象,它与调用类对象的getClass()
方法所获得的结果是一样的。当然对于接口(Interface)就只能用.class
的方式来获取了。
特殊保留字(Special Reserved Words)
null
、true
、false
并非Java里的关键字,但是在代码中也不能用它们作为名字,因为它们在Java里有特定的含义,指定了特定的值。其实任何的数字也可以算在这一类中,因为它们也代表着特定的常量。
const
和goto
也算不上关键字,因为它们并不用在代码中使用。Java使用final
来匹配了const
在C/C++中的意义。Java保留了goto
,但因为它在C/C++中可谓臭名昭著,所以也算是将其打进地牢,禁止开发者触碰。
值得一提
本文的对关键字的分类并非官方,只是个人意见。对于部分分类其实也有其他想法,比如assert
、new
、throw
、instanceof
更像是运算符(operator),那样想它们可以放在一块。此外else if
一起是否可以算作一个关键词?
在Java里面break
和continue
还支持标签来跳出多层循环,不过标签在C/C++中多数与goto
一起使用,这似乎让break
和continue
也陷入了坏的编程方式中,所以在实践中很少使用。
synchronized
除了能修饰符,还会出现在控制语句中,用来给指定对象加上线程锁。对于流程控制的关键字,如果再细分还可以分成两类:分支(Branching)语句和循环(Looping)语句,但其实它们都是条件(Conditional)语句。
null
在Java中其实挺令人讨厌的,因为会引起NullPointerException
。不过instanceof
语句里出现null
并不会抛出异常,而是永远返回false
,因为null
不是任何类的实例。自Java 7起,switch语句开始支持,但switch
却不兼容null
值,如果出现null
就会抛出NullPointerException
。对于这个问题,网上也有相关的解释。
这是新建文章 1.html,请修改添加正文内容,pp store aso pp store aso 。