这一章我们重点来学习一下Java中一些关键字。
关键字大家都知道对吧,我们Java基础最初就是从关键字入门的,忘记的大家可以去看我的博客《Java学习里程-----Java基础_1语法》。
但我还是简单说一下关键字。关键字就是Java这个语言给自己预留的一些单词,这些词它已经赋予了一定的含义以及使用方式,我们呢,尽量避免在定义的时候使用关键字去定义,这样会让Java语言蒙圈。
先贴出来有那些关键字:
接着,我们废话不多说,先来看其中一部分:
我们可以发现啊,其实很大一部分我们已经使用过了,这个里面蓝色字的都是我们常用的,下面我们一列一列的来介绍,按行介绍我得写太多标题了,所以我们按照列去看:
第一列:
abstract:这个单词原本的含义是:抽象。而且我们前面也说了,并且有使用过这个,所以略过,不知道的可以看我另外一个博客:《Java学习里程-----Java基础_13抽象类》。
enum:这个单词原含义是:枚举。但是我们还没有讲到,所以,我暂时买个关子,不说他,但是要知道啊,这个是在枚举的时候要用到的。
instanceof:这个词我们学习到现在是没有见到过的,这个词的意思是:实例(我从Google翻译上查看的),我估摸着这个单词的含义不对。我先来说这个东西是什么。
这个instanceof关键字,是Java中保留关键之之一(这是一句废话,但是也要说),它是Java中的一个二元运算符,左边是对象,右边是类。作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。我直接上一段代码,给大家看。
这就是简单使用一下instanceof,这个呢一般我们在学习框架的时候经常见到,到时候开了框架我们来用。但是现在要记住这个词,以及它是干啥的就好了。
transient:这个单词现在说可能有点早,我们简单知道这个词的意思,然后后期同样我们再学习框架的时候再来说这个。
Java 中的 transient 关键字被用来表示变量将不被序列化处理。用了这个词呢,就说明这个变量不会被实例化,不被实例化就没有办法传输。好,暂时了解这么多。
第二列:
assert:这个我们不常用,有兴趣的同学可以去研究一下,我是从事这么多年没有用到过这个东西。。
goto:这个也不常用,因为这个会破坏程序结构,现在很少有人用,我以前学习C的时候很喜欢用,但是因为这个家伙会破坏结构,所以就不去使用了。好像听说以后不会再去使用这个东西了。
synchronized(第二列我们主要来说这个):
单词的意思:同步。
这个词语,我们再学习单例模式的时候有用到过这个,大家可以一边学习单例模式一边学这个关键字。《Java23中设计模式1——创建型模式之单例模式》
我先来给出这个关键字的作用:它可以保证同一时刻最多只有1个线程执行被Synchronized
修饰的方法或代码。这也就是说,每一次执行这段代的只有一个线程,不会出现两个线程同时执行。
这个一般用在并发的时候,比如说抢馒头,一共三个馒头放在桌子上,但是每次只能有一个人抢,并且吃掉它,只有等这个人吃完,才会进行下一次抢。这个时候我们就用到了synchronized这个关键字。因为在计算机中线程的执行速度是非常快的,有了这个关键字,我们可以保证每一次只有一个线程去调用这段代码或者方法。
具体使用我们再学习线程的时候来说,包括优点缺点。
第三列:
final
final被翻译成最后、最终。它在Java中也是这个意思(最终)。
我们在学习接口的时候见过这个单词,当时我们定义了一个常量NAME的时候,就有用到这个东西,我再来发一下
在Java中是这样描述final的:final可以修饰类、方法、变量等。被final修饰的东西有以下特点:
1. 使用final声明的类不能被继承;
2. 使用final声明的方法不能被子类覆盖;
3. 使用final声明的变量不能被修改,即为常量;
所以我们一般用final去创建一些不可以被继承的类、或者是静态常量。我上面的那个NAME就是一个常量。
第四列:
volatile:
第四列我们着重来说这个,其他的我们都认识,见过。
这个词的意思是:易挥发的(Google查找)
这个词呢,很容易被理解错误,所以要好好看。
在Java中,每个线程都有一个独立的内存空间,称为工作内存。在这个工作内存中保存了用于执行操作的不同变量的值。在执行完成某一次操作之后,线程会将变量的值从新存放到主内存中,这样下一个线程来了之后,带着新的值继续去操作。
但是,这样会有一个时间差,比如说定义了一个int类型的变量a,赋值0,A线程去带上0操作去了,在操作的过程中,B线程来了, 发现a是0,所以呢,就带上0也去操作去了,B前脚走,后脚A回来了,A将这个操作之后的变量a存放到主内存中,比如说变成2了,这时候,B回来了,同样也将变量a放回到主内存中,并改成3。这时候,问题来了,B应该是用的2去操作,但是A那时候没有回来,所以就带上0去操作了,这样的话,出现了数据偏差。
Java为了解决类似的问题,就弄了一个volatile关键字标记一个变量,在多个线程访问它的情况下,总是转到主内存,读取和写入(和synchronized关键字类似,但是有区别)。
synchronized是一种重量级的锁,可以锁住代码块、方法块,而volatile是一种轻量级的锁,但是可能会出现一定的错误。
我们暂时了解到这里,后面我们开了线程,我们在内个时候来说这个synchronized和volatile的使用。
第五列:
throws
单词意思:抛出
可能单看这个抛出,我们并不知道抛出什么玩意,我现在直接告诉你,这个是和Java中的异常一起来使用的,也就是抛出异常。这个同样等到我们学习到Java的异常的时候我们来说。
关键字我们就学习到这里,有不懂得同学可以加我QQ,2100363119