在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 。