JAVA语言——关键字

Posted by 冷眼樵夫 on 12-25,2018

我们在之前的java运行机制里面有介绍到,我们编写的代码需要先编译成字节码文件(class文件),再由解释器解释成二进制文件,才能通过虚拟机调用物理机器,完成相关指令操作,在编写代码的时候,我们就会需要用到一些事先定义好,有其独特意义的标识符,专门提供给机器语言识别的词语,这就是所谓的关键字,鉴于这些关键字有特殊含义,所以它不能作为变量名、方法名、类名、包名或参数名等等。

在java中,总共有51个关键字,2个保留字,其中"const"和"goto"是其他电脑语言的关键字,所以在java当中没有具体含义。

接下来就看看每一个关键字的作用。

关键字列表总纲

访问控制:private、protected、public

定义类、接口、抽象类和实现接口、继承类的关键字、实例化对象:class、abstact、interface、extends、implements、new

修饰方法、类、属性和变量:static、final、super、this、native、strictfp、synchronized、transient、volatile

程序控制语句:break、continue、return、do、while、if、else、for、instanceof、switch、case、defautl

错误处理:try、catch、final、throw、throws、assert

包相关:import、package

基本类型:boolean、byte、char、double、float、int、long、short

基本值:null、true、false、enum

变量引用:super、this、void

保留字:const、goto

每个关键字解析

访问控制:

private 私有的,只能被类本部使用。

protected 受到保护的,可以被类本部、本包和子类使用。

public 公有的,可以被任意使用,类本部、本包,子类和外部包。

1、外部类只能被public和默认修饰,个人认为其原因是如果类具有局限性,那么其他类在使用的时候就不方便,设计者就干脆不允许这种行为。
2、default的范围是弱于protected的,default只能被本包和类本部使用。

定义类、接口、抽象类和实现接口、继承类的关键字、实例化对象:

class 创建一个类。

abstract 定义抽象类或者抽象方法,子类必须实现父类所有方法,除非子类也是抽象类。抽象类中不一定全是抽象方法,可以是具体方法或私有变量。

interface 定义接口,java不支持多重继承,但是支持一个类实现多个接口。接口中的类必须是Public static,变量必须是public static finaly。

extends 继承,java只支持继承一个类。

implements 实现接口的声明。

new 创建一个新的对象的声明。

修饰方法、类、属性和变量

static 静态声明,可以在没有创建对象的情况下进行调用,不能使用super和this,用于静态方法、静态变量、内部类。静态方法不能调用非静态方法,但是非静态方法可以调用静态方法。

final 最终不可被改变的,修饰的类不能被继承、修饰的方法不能被重写、修饰的变量不可以被改变地址、jvm会自动监测final并为其尝试寻求内联,可以提升java的效率、被final修饰的常量,在编译阶段会存入调用类的常量池当中

native java调用非java接口,即方法所对应的实现不是在当前文件,而是在用其他语言实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。

strictfp 用于让类、接口或者方法都处于精确运算的环境下。不允许对接口中的方法以及构造函数声明strictfp关键字。

synchronized 同步互斥,用于线程同步的时候,对方法进行加锁操作,只能让一个线程运行。

volatile 用其修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新值。用于进行线程并发处理时候对于缓存一致性和保持原子性操作。目的是为确保所有线程读取到指定变量的值都是相同的。
1、表示可以被多个线程异步修改的成员变量。
2、由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低。
3、在很多java虚拟机上面未实现该功能。

transient 在java当中可以使用serialization进行序列化对象操作,如果希望一个特殊的对象数据成员不被序列化,那么使用transient就可以让其不被序列化。

程序控制语句

if 如果,适用于判断语句。

else 否则,用于判断语句分支语句。

while 当什么时候,循环语句的一种,适用于当什么执行什么。

for 满足三个条件的循环语句,for(单次表达式;条件表达式;末尾循环体)。用于指定一个在每次迭代结束前检查其条件的循环。

switch 用于基于某个表达式选择执行某种代码块中的一个。switch 条件的计算结果必须等于 byte、char、short 或 int。如果没有break,那么会一直执行下去。

case 用于switch中标记每个分支,case需要用break来进行结束。

default 用于switch中作为最后处理方式;用于泛型定义中使用default关键字代表不确定的变量或者参数。

do 用于指定一个在每次循环结束之后就会检查其条件的循环。条件表达式后面必须有分号、do while必须执行一次。

break 用于循环中退出自身的循环。

continue 用于循环中某单次循环不继续执行,但是整个循环照常执行。

return 使方法返回到调用它的方法,从而传递与返回方法的返回类型匹配的值。

instanceof 用于确定对象所属的类,通常用于判断父类或者接口的引用是否是某个子类的实例。

错误处理

try 捕获异常,用来监视可能发生异常的代码,可以跟catch,也可以跟Final组合使用。

catch 异常出错处理。

finally 无论异常是否发生都会执行。有一种情况Try+finally,不出现异常则全部出现,如果出现异常就会跳到finally,然后后面的代码就不会执行了,因为异常未捕获,会中断代码执行。

throw 人为抛出异常。

throws 在方法或者类上加,将内部出现的异常抛到上一层进行处理。

包相关

impor 引用包的关键字。

package 指定在 Java 源文件中声明的类所驻留的 Java 包。

基本类型

byte 字节型,用于定义临时变量、形参、属性的数据类型。1byte
char 字符类型. 2byte.
boolean 布尔类型,true和false 字节数是动态的,boolean类型占了单独使用是4个字节,在数组中又是1个字节。、

查阅《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。
那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。大多数人都会很自然的这样去想,我同样也有这个疑问,经过查阅资料发现,使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。

short 短整形, 2byte.
int 整形, 4byte
float 浮点数, 4byte
long 长整型, 8byte
double 双精度, 8byte

null 空值,表示内存当中没有这个对象空间,将 null 赋给非原始变量相当于释放该变量先前所引用的对象。Null不能被赋值给原始数据类型。
true 真,布尔值的字面值。
false 假,布尔值的字母值。

变量引用

super 表示当前对象的父类对象的一个引用;
this 引用自身的指针,只能在非静态方法中使用;
void 无返回,可以用作方法的返回类型。

保留字

const 常量。用于修改字段或局部变量的声明。它指定字段或局部变量的值是常数,不能被修改。
goto 跳转。指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。

总结

至此,所有关键字都已经解释完成了,有了个初步印象,有些关键字仅仅了解就可以了,比如基本数据类型关键字,访问权限控制关键字等;有些关键字就需要慢慢仔细研究,比如static、final、synchronized等。

其实个人认为关键字其实就是电脑语言自己定义的词语,每个词语代表不同的意思,能够被电脑识别,这些关键字的存在简化了编程,就好像数学公式一般可以解决实际问题。所以有些人觉得自己英语不好就觉得编程难学挺没道理,只要学会这些关键字并了解怎么用,那么在使用的时候将其组合起来,整个编程就会很简单。

毕竟编程还是看重的算法+数据结构,思维能力更加重要。


0评论