Java关键字简介
Java关键字(Keywords)是计算机语言里预先定义的符号,是具有特别意义的标识符,有时也包括保留字(Reserved Words),广义上也包括特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等。
到目前为止,java语言共确定48个关键字和14个保留字。为便于总结,我自己根据对java语言的学习经历和经验,对已有明确定义的48个关键字进行分类和解释,本表格仅仅是自己学习时根据不同关键字的理解进行分类,如有错误,欢迎大家指正。
类型声明型:13 | 基本数据类型:8 | boolean char byte short int long double float |
引用数据类型:3 | class interface enmu | |
特殊类型:2 | void package | |
类型声明标识型:3 | extends implents import | |
修饰符型:11 | 访问权限修饰符:3 | public protected 默认权限(无符号)private |
并发功能修饰符:2 | synchronized volatile | |
其他功能修饰符:6 | abstract final static transient strictfp native | |
程序控制型:17 | 条件判断:5 | if else switch case default |
循环:5 | for while do continue break | |
异常处理:6 | try catch finally throw throws assert | |
方法终止:1 | retrun | |
变量引用指代型:2 | this super | |
运算符型:2 | new instanceof | |
保留字:14 | true false null const goto outer inner byValue cast rest future genenric var operator |
Java关键字的详细介绍
(一)类型声明型关键字
基础数据类型
Java中规定8个关键字分别对应8种基本数据类型。可修饰变量,包括成员变量、本地变量以及方法参数,也可用在成员方法的声明中表示返回值的类型。
(1)boolean:表示布尔型数据,在计算机内存中占用1个字节(1byte = 8bit),储存逻辑运算的结果,有且仅有true和false两个值,默认值为false(00000000) 。
(2)char:表示字符型数据,在计算机内存中占用2个字节,无符号整型,范围为0~2^16-1,但实际存储的值是编码表中对应的各种符号。java使用Unicode编码,在Unicode编码表中,可以用两个字节表示一个汉字,因此java中一个char能存一个汉字,注意,Unicode只收录了常用汉字。
(3)byte :表示字节型数据,在计算机内存中占用1个字节,有符号整型,范围为-2^7~2^7-1,存储的是整数数字。
(4)short :表示短整型数据,在计算机内存中占用2个字节,有符号整型,范围为-2^15~2^15-1,存储的是整数数字。
(5)int :表示整形数据,在计算机内存中占用4个字节,有符号整型,范围为-2^31~2^31-1,存储的是整数数字。
(6)long :表示长整型数据,在计算机内存中占用8个字节,有符号整型,范围-2^63~2^63-1,存储的是整数数字。
(7)double:表示单精度浮点型数据,在计算机内存中占用4个字节,存储的是小数。
(8)float:表示双精度浮点型数据,在计算机内存中占用8个字节,存储的是范围更广的小数。
引用数据类型
(1)class:表示声明一个类,即类声明的标志。外部类(严谨地说应该是字节码文件名中第一个$左边那个类,这么说好累啊,e.g. Boy$Girl$Love.class中的Boy类) class前面须有访问权限修饰符public或者默认权限(又称为包访问权限符,默认不写,不管是内部类还是外部类,此时该类只能在本包中使用),final或者abstract(二者不可得兼,final修饰的类不可继承,不管是外部类还是内部类)中的组合;内部类可用static、final、abstract修饰,可选用任意的访问权限修饰符(public/protected/默认权限/private)。当然,类内部也可以嵌套接口(内部接口,可用abstract、static修饰,默认abstract已存在可不写)、枚举(内部枚举,可用static修饰)、类(可用final、static、abstract修饰),可选用任意的访问权限修饰符。另外,所有的类的默认父类是Java.Lang.Object,在类声明中明确指示父类时,父类为指示的类,因为类是单继承。
public class ClassDemo {
@Test
public void name() {
System.out.println(ClassDemo.class);//class testClass.ClassDemo
System.out.println(ClassDemo.class.getSuperclass());//class java.lang.Object
}
public static class InnerClass extends Thread{
@Test
public void name() {
System.out.println(InnerClass.class);//class testClass.ClassDemo$InnerClass
System.out.println(InnerClass.class.getSuperclass());//class java.lang.Thread
}
}
}
(2)interface:表示声明一个接口,即接口声明的标志。interface前面只能用public或者默认权限(可不写)修饰,以及abstract(默认已存在,可不写)。public代表可跨包实现,而默认权限则只能在本包实现。接口内也可嵌套类(可用final、static、abstract修饰)、枚举(可用static修饰)、接口(可用static、abstract修饰,默认abstract已存在可不写),可选用任意的访问权限修饰符。
public interface InterfaceDemo {
interface InnerInterface{
void test1();
}
}
public class Test implements InterfaceDemo{
@org.junit.Test
public void name() {
System.out.println(InterfaceDemo.class);//interface testInterface.InterfaceDemo
System.out.println(InterfaceDemo.class.getSuperclass());//null
}
@org.junit.Test
public void name1() {
System.out.println(InterfaceDemo.InnerInterface.class);//interface testInterface.InterfaceDemo$InnerInterface
System.out.println(InterfaceDemo.InnerInterface.class.getSuperclass());//null
}
}
(3)enmu:表示声明一个枚举,即枚举声明的标志。enmu前面只能用public或者默认权限(无符号可不写)修饰,作用同上。枚举可以实现一个或多个接口,但是枚举的默认父类是java.lang.Enum<E extends Enum<E>>且不可更改,而不是java.lang.Object,所以枚举不能显示的继承其他类,类继承的唯一性。可嵌套类(可用static、final修饰)、接口(可用abstract、static修饰,默认abstract已存在)、枚举(可用static修饰),可选用任意的访问权限修饰符。另外,枚举的构造器必须用private或者默认权限修饰,这是规定。
特殊类型
(1)void:用在方法声明中,表示方法执行后无返回值,也可以说是没有类型要求的返回值,那就是不存在喽。
(2)package:表示包,为避免类名之间的冲突而设置的空间命名方式,一个类(class)必须在一个包(package)中,包名+类名即全限定名,可用来唯一定位类所在位置。由于package都具有相近的结构,可以将其视为一种特殊的类型。
(二)类型声明标识型关键字
(1)extends:表示继承关系,即存在父类或父接口,有两个表述,(一)子类继承父类(非final修饰的类)的非private修饰成员以及非默认权限成员(若子父类不在一个package);(二)子接口继承父接口,接口不存在以上规则,因为接口中的成员变量(Fields)只能用public static final修饰,且方法只能用public(只有public访问权限)以及abstract、default、static(三者中的一个),strictfp修饰。不管是类还是接口,只能一对一继承。
另外,补充一下类继承中可见性原理,包括继承时和继承后:①继承时:同一包下,除final修饰的类外,都可被继承;不同包下,除final修饰的类外,public(必须有该标识符)修饰的外部类和public static(必须有这两个标识符)修饰的内部类可被继承。②继承后:同一包下,除private修饰的变量,都可被访问;不同包下,只有public和protected修饰的变量可被访问。
(2)implemments:表示实现关系,即一个类实现接口,相当于继承接口中声明的成员变量以及重写接口中的抽象方法,其中接口中的成员变量默认public static final修饰,接口中的方法默认是public访问权限,以及abstract、default、static(三者中的一个)、strictfp修饰,可以一对多实现,面向接口编程思想实现的途径。
(3)import:表示导包,即该包中的类被调用者可见,也相当于添加依赖关系,但不影响访问权限修饰符的作用。若调用者调用者与被调用者不在同一包下,那么二者依然是不同包。
(三)修饰符型关键字
访问权限修饰符
这里就不详细总结了,大家可根据以上内容自行贯通。附上经典的表格说明,^_^。
同一类中(同一包的特殊情况) | 同一包中(不含同一类情况) | 子类中(同一包或不同包) | 不同包中 | |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
默认包访问权限(无符号) | √ | √ | × | × |
private | √ | × | × | × |
并发功能修饰符
(1)synchronized:由JVM底层实现的同步锁机制,可用来修饰方法和代码块。修饰方法时,该方法为同步方法,锁是对象锁this(指代调用者),方法每次只允许一个线程调用,该关键字只能修饰非抽象方法(也就是说,不能和abstract连用),因为方法中有具体的方法体时JVM才能确定同步内容,一般放在返回值类型前;修饰代码块时,该代码块为同步代码块,一般结构如下:
synchronzied(Object obj){
//To do
}
其中,obj为锁对象,既可以是类的实例(new出来的对象的引用),称为对象锁,也可以是类本身(类名.class),称为类锁。
补充一点:同步非静态方法就是对象锁,同步静态方法就是类锁,因为静态(static修饰的)的都属于类。
(2)volatile:表示轻量级的同步机制,由JVM底层实现,只能用来修饰成员变量,被修饰的成员变量保证多个线程中的“内存可见性”,从而确保并发访问共享数据时数据的有效性和正确性。
其他功能修饰符
我之所以将以下关键字称为其他功能修饰符,实在是抽取不到它们之间的共性了,姑且就这么分吧。
(1)abstract :表示抽象,没有具体实现。只能修饰class/interface/成员方法,修饰类(class)时类为抽象类,修饰接口(interface,默认已存在可不写),修饰方法(method)时方法为抽象方法,无方法实现体。
(2)final:表示最终、不可改变。修饰基本数据类型时,表示变量的值不变,修饰引用数据类型时,表示内存地址不变。可修饰类(不可被继承)、方法(可被子类继承但不能被子类重写)、变量包括成员变量和本地变量(不可变性)、方法的参数(只有8个基本数据类型关键字和final才能修饰方法的参数),不能修饰接口(因为接口是用来实现的)、枚举。不可与abstract同用,因为abstract要求方法实现。
(3)static:表示静态,被static修饰的都是属于对象的,可利用对象名直接调用;在类加载过程中,执行<cinit>方法初始化时执行static修饰的代码,且仅加载一次。可修饰成员方法、成员变量、代码块、内部类、内部接口、内部枚举,注意:在接口中修饰方法时该方法必须有方法体。
(4)transient:表示不被序列化。只能用来修饰成员变量,当对象存储时,被它修饰的成员变量的值不需要被存储。transient关键字标记的成员变量不参与序列化过程。
(5)strictfp:表示精确浮点运算(strict float point ) 。strictfp 关键字可应用于类、接口、枚举和方法。使用 strictfp 关键字声明一个方法时,该方法中所有的float和double表达式都严格遵守FP-strict的限制,符合IEEE-754规范。当对一个类或接口使用 strictfp 关键字时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着所有表达式的结果都必须是 IEEE 754 算法对操作数预期的结果,以单精度和双精度格式表示。在浮点运算时,可以用strictfp保证不同硬件平台所执行的运算结果的一致性。
(6)native:表示调用非java代码实现的方法,此类方法的实现体为非java代码实现体。native预示着方法有实现体,但该实现体是非java代码,因此,native不能与abstract连用,不能在接口中存在(abstract表示无方法实现体,default和static修饰的接口中方法要求的是java代码实现体)。可与public protected 默认权限 private , boolean char byte short int long double float void , synchronized static final strictfp 关键字连用。
对修饰符作用的总结:
(1)类类型中:
类:修饰符有public 默认权限 , strictfp abstract final且abstract与final不连用;嵌套类中,修饰符有public protected 默认权限 private , strictfp abstract static final且abstract与final不连用;嵌套接口中,修饰符有public protected 默认权限 private , strictfp abstract static其中abstract是默认已存在;嵌套枚举中,修饰符有public protected 默认权限 private , static strictfp。
成员变量:修饰符有public protected 默认权限 private , boolean char byte short int long double float , volatile final static transient 。
成员方法:修饰符有public protected 默认权限 private , boolean char byte short int long double float void , synchronized static final strictfp , abstract(抽象方法),native(非Java代码实现)。
方法参数:修饰符有 boolean char byte short int long double float , final。
本地变量:修饰符有public protected 默认权限 private , boolean char byte short int long double float , final。
(2)接口类型中:
接口:修饰符有public 默认权限 , abstract 默认已存在;嵌套类中,修饰符有public protected 默认权限 private , strictfp abstract static final且abstract与final不连用;嵌套接口中,修饰符有public protected 默认权限 private , strictfp abstract static其中abstract是已默认存在;嵌套枚举中,修饰符有public protected 默认权限 private , strictfp static。
成员变量:修饰符有public , static final ,并且是默认都存在的。
成员方法:修饰符有public默认存在的 , abstract default static且三者只能选用一个 , strictfp。
方法参数:修饰符有 boolean char byte short int long double float , final。
本地变量:只存在default与static修饰的方法中,修饰符有public protected 默认权限 private , boolean char byte short int long double float , final。
(3)枚举类型中:
枚举:修饰符有public 默认权限 , strictfp;嵌套类中,修饰符有public protected 默认权限 private , strictfp abstract static final且abstract与final不连用;嵌套接口中,修饰符有public protected 默认权限 private , strictfp abstract static其中abstract是默认存在的;嵌套枚举中,修饰符有public protected 默认权限 private , strictfp static。
成员变量:修饰符有public protected 默认权限 private , boolean char byte short int long double float , volatile final static transient 。注意,枚举变量前面默认public static final修饰。
成员方法:修饰符有public protected 默认权限 private , boolean char byte short int long double float void , synchronized static final strictfp abstract native。
方法参数:修饰符有 boolean char byte short int long double float , final。
本地变量:修饰符有public protected 默认权限 private , boolean char byte short int long double float , final。
(四)程序控制型关键字
条件判断
(1)if :表示判断并选择。常用的条件判断语法,可单独使用,也可与else连用,若符合条件,则进入执行体。常用格式如下:
if(condition){
//代码执行体
}else{
//代码执行体
}
(2)else: 表示判断并选择。常用的条件判断语法,不可单独使用,只能与if连用,常用格式如上。
(3)switch:表示判断并选择。常用的条件判断语法,不可单独使用,只能与case连用,在执行体中根据case判断结果决定具体执行代码。
switch(Object obj){
case: obj.value
//代码执行体
break;
......//可存在许多case
default:
//默认的代码执行体
break
}
(4)case:表示判断并选择。同上。
(5)default :表示默认。在switch条件判断语句中,表示在无匹配case的条件下的执行结果;另外,在1.8JDK中,该关键字可在接口中修饰方法,但被其修饰的方法必须有方法体。
循环
(1)for:表示迭代循环,一般在确定循环次数时可使用此循环结构,并衍生出一种增强循环。
(1)数组常用
for (int i = 0; i < args.length; i++) {
String string = args[i];
//执行代码
}
(2)集合迭代器
for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
type type = (type) iterator.next();
//执行代码
}
(3)增强for循环
for (String string : args) {
//执行代码
}
(2)while:表示迭代循环,可单独使用,也可与do连用。
(1)迭代器
while (it.hasNext()) {
type type = (type) it.next();
//执行代码
}
(2)一般判断条件
while (condition) {
//执行代码
}
(3)do:表示循环中的执行体,即使判断条件不成立,do代码块也会执行一次。
do {
//执行代码
} while (condition);
(4)continue:表示在循环体中,对满足条件的循环不执行,直接跳过,执行下一个循环。
for (int i = 0; i < 5; i++) {
if (i==3 ) {
continue;
}
System.out.println(i);//结果是0/1/2/4
}
(5)break:表示在循环体中,对满足条件的循环不执行,直接跳出本循环体,结束本循环。注意只是跳出本循环,不影响外层循环。
for (int i = 0; i < 5; i++) {
if (i==3 ) {
break;
}
System.out.println(i);//结果是0/1/2
}
异常处理
异常处理是程序编写和运行时重要的环节,最简单的处理方式就是使用throws关键字直接抛给调用者,当然也可人为控制的处理方式,那就是使用try catch finally throw代码块进行处理。
(1)try:表示在代码块执行前,对代码进行异常检查。若发现有异常,则异常交给catch代码块进行处理;否则,正常执行代码。
(2)catch:表示对捕获的异常进行处理。一般在该代码块中会使用throw关键字显示异常信息。
(3)finally:表示无论try代码块中是否存在异常,都会执行finally代码块中的代码。
(4)throw:表示显示异常信息或遇到异常时显示的信息。
(5)throws: 表示异常处理方式,运行中若出现异常,则将异常向上抛出,抛给调用者,一般用在方法声明和类声明中。补充向上抛出异常规则。
(6)assert:表示在代码执行前的一种检查行为。编写代码时,总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。若判断结果为false,则程序抛出异常,并中止执行,类似于Junit单元测试。
public class Demo {
public static void main(String[] args) throws Exception {
name();
}
public static int name() throws Exception{
int a = 0;
try {
a = 1/0;
} catch (Exception e) {
throw new ArithmeticException("Error!");//显示异常信息:
//Exception in thread "main" java.lang.ArithmeticException: Error!
}finally {
System.out.println("Always Operation!");
}
return a;
}
执行结果如图:
方法终止
(1)retrun:表示方法正常执行结束的标志,可单独使用或者后面接方法执行的结果。
(五)变量引用指代型
(1)this:表示对象本身的引用,默认存在的一个成员变量或构造方法this()。
(2)super:表示父类对象的引用,默认存在的一个成员变量或构造方法super()。
(六)运算符型
(1)new:表示创建对象,可理解为动态内存分配符(一种抽象运算吧)。比如代码<code>Object obj = new Object(); </code>在执行时,第一步,将方法压栈(stack)执行,将要执行的方法信息加载;第二步,执行对象创建操作,执行<init>方法,调用Object类的无参构造方法,在JVM的堆内存(heap)中创建对象并分配一个内存地址;第三步,执行赋值操作,将内存地址赋值给obj引用变量。大致可以这么理解,因此,new可以算是一种运算符。
(2)instanceof:表示类型判断,比如代码<code>obj.instanceof Object; </code>在执行时,对象引用obj与Object类进行判断,若obj是Object的子类或自身,则返回true,否则返回false。
(七)保留字
保留字就不作介绍了,等官方慢慢产出吧。