Java中关键字有54个之多。常用的那些字不必说,有几个关键字并不常见,但是面试中可能成为面试官挖的一个坑,深坑。
今天我们就来总结下这几个沧海遗珠。
1、native
字如其名,用来修饰Java本地(原生)调用的方法。简单的说就是Java调用原生的C/C++的方法。NativeMethod是这样一个Java的方法:该方法的实现由非Java语言实现,比如C或者C++。
标识符native可以与所有其它的Java标识符连用,但是abstract除外。这是合理的,因为native暗示这些方法是有实现体的,只不过这些实现体是非Java的,但是abstract却显然的指明这些方法无实现体。在定义一个nativemethod时,并不提供实现体(有些像定义一个Javainterface),因为其实现体是由非Java语言在外面实现的
2、strictfp
strictfp,全称strictfloatpoint(精确浮点)。
strictfp关键字可应用于类、接口或方法。使用strictfp关键字声明一个方法时,该方法中所有的float和double表达式都严格遵守FP-strict的限制,符合IEEE-754规范。当对一个类或接口使用strictfp关键字时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着所有表达式的结果都必须是IEEE754算法对操作数预期的结果,以单精度和双精度格式表示。
在进行科学计算时可以使浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,可以用关键字strictfp。算钱的花还是算了,用整形会更好一点。
3、transient
transient(临时的)变量修饰符,只能用来修饰字段。被它修饰的变量,在对象存储时(序列化),这些变量状态不会被持久化。当对象序列化的保存在存储器上时,不希望有些字段数据被保存,为了保证安全性,可以把这些字段声明为transient。
4、volatile
volatile(易变的)变量修饰符,也只能用来修饰字段,用于多线程的场合。volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
这样可以防止两个方法同时被执行,还可以保证j和i被同时更新,这样一来i和j的值一直是一样的。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字
5、default
肯定有人说,这也算?哪个switch里没有个default?这里所说的default不是switch的默认,而是jdk8新增的特性。default方法。我们都知道在Java语言的接口中只能定义方法名,而不能包含方法的具体实现代码。接口中定义的方法必须在接口的非抽象子类中实现。也许oracle觉得这种方式太不方便了,写了接口还得写个抽象类去实现公有的方法,so在8上就出了这么个东西。
看下1.8的Map接口里的remove方法。接口的方法里竟然有方法体。
default方法,也可以称Defender方法,或者虚拟扩展方法(Virtualextensionmethods)。Default方法是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。
以上几个关键词,如果在面试中对答入流,那一定加分许多。
关注“动力节点Java学院”微信公众号,获取更多相关资讯,如果你想要学习Java,可报名动力节点免费试学Java初级课程,亲身感受这里的学习氛围。
网友评论