细节决定成败,浅析一些容易被忽视的Java关键字

原创 2016年08月28日 22:38:38

一、default关键字

default关键字,并不是访问修饰符中的default(默认的访问权限,不加public、private、protected访问修饰符的情况自动使用,同一包下的类可以访问字段),而是Java8的新特性,default关键字是不能修饰字段的。

Java8以前的认知,Java的接口中的方法只能定义不能有方法体,方法体是由实现类去实现的。但是如果当我们要去扩展接口时,所有接口实现类都需要去实现这个方法,这在某些业务场景中会非常不方便。所以,Java8中引入了default方法,也叫作Defender方法。通过在方法前加上default关键字,使接口方法有了默认的实现。

example:

带有一般方法与默认方法的接口:

public interface TestDefault {
	public void normalMethod();
	
	default public void defaultMethod(){
		System.out.println("Default method!");
	}
}
测试类,只实现了接口中的一般方法:

public class Main implements TestDefault{

	@Override
	public void normalMethod() {
		System.out.println("Normal method!");
	}
	
	public static void main(String[] args){
		Main main = new Main();
		main.normalMethod();
		main.defaultMethod();
	}
}
但是使用default方法有一个很关键的问题,在当一个类实现两个及以上接口时,存在两个同名的default方法时,这时调用会有冲突,编译器不知道要调用哪个default方法,这一点要注意!

二、native关键字

native关键字用来修饰方法,且此方法声明时不能有方法体。native表明这个方法是使用其他语言如C/C++实现的,并生成了.dll文件,JVM通过JNI技术与.dll交互完成native功能(Java也是通过JNI技术与底层操作系统交互的)。

通过native,可以使用Java不方便实现的东西,如高效的访问操作系统,用其他编程语言实现。

使用native时也有一点需要注意,native可以与其他Java标识符连用,但是不能与abstract连用,因为使用native方法时就说明它有其他语言的实现,而abstract却显式指明了方法是无实现体的。

更多的关于native与JNI知识可参看博客:http://blog.csdn.net/xw13106209/article/details/6989415

三、transient关键字

transient是变量修饰符,只能修饰变量,被修饰的变量在对象持久化时,该值不会被保存。

说起transient就必须先说Java的serialization机制,这种机制提供了将Java的对象型数据存储到关系型或其他类型数据库或硬盘中(也就是持久化)。需要持久化的对象的类定义时需要实现Serializable接口。但是只实现Serializable接口会导致所有变量,有用的没用地都会被持久化,这样可能会影响效率与安全性,所以就需要transient控制。


四、const与goto关键字

呵呵,放松一下,只是Java的保留字,暂时没有用到哦。


五、strictfp关键字

strictfp 关键字表示精确浮点,可应用于类、接口或方法。使用 strictfp 关键字声明一个方法时,该方法中所有的float和double表达式都严格遵守FP-strict的限制,符合IEEE-754规范。当对一个类或接口使用 strictfp 关键字时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着所有表达式的结果都必须是 IEEE 754 算法对操作数预期的结果,以单精度和双精度格式表示。 

如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,可以用关键字strictfp。


六、volatile关键字

volatile关键字用来修饰类成员变量,这个变量每次被线程访问时都会强迫从共享内存中重读变量值,而且,当该变量值发生改变时,JVM会强迫线程将变化值写到共享内存中。通过volatile就保证了不同线程同一时刻总是看到的是同一个值,保证了并发数据安全。

需要特意用volatile实现这样功能的原因是,Java语言规范了:为了获得最佳速度,允许线程保存共享成员属性的私有拷贝,而且只有当线程进入或离开同步代码块时才与共享成员变量的原始值对比。

需要注意的是,volatile应使用在多个线程访问一个成员变量的情况,但当该变量已经在synchronized代码块中或者它是常量的情况就不需使用volatile了。volatile保证并发数据安全的同时需要付出效率的代价,所以一定要在需要时才使用这个关键字。

这个关键字其实并不容易忽视,只要你深入地学习Java,这个关键字无法绕开。要想用好volatile关键词,需要了解到计算机内存模型、Java内存模型、并发编程概念等知识,通过学习这个关键字可以学习到很多有意义有意思的知识,可以参看海子的博客,我非常非常喜欢他写的客,http://www.cnblogs.com/dolphin0520/p/3920373.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java语言中关键字strictfp的用途

自Java2以来,Java语言增加了一个关键字strictfp,虽然这个关键字在大多数场合比较少用,但是还是有必要了解一下。strictfp的意思是FP-strict,也就是说精确浮点的意思。在Jav...
  • redv
  • redv
  • 2005年03月22日 12:02
  • 6656

java中不常见的关键字:strictfp,transient

1.strictfp, 即 strict float point (精确浮点)。   strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字声明一个方法时,该方法中所有的fl...

Java——static修饰符、final修饰符、abstract修饰符、接口

一、static修饰符 static修饰符可以修饰变量、方法或代码块 用static修饰的变量叫静态变量。 静态变量有如下注意事项: 类中的静态变量属于类,而不属于某个特定的对象。类的静态成员可以...

一套Java面向对象技术试题的分析

注:         教师的点评以粗体+红色标出。    回应见本博客《与学生谈“编程”和“考试” 》  Java面向对象试题分析 说明:       (1)考试时间为2小时。       (2)除简...
  • bitfan
  • bitfan
  • 2009年12月28日 18:31
  • 24898

win7 系统下配置 java 环境变量———细节决定成败,一个逗号都不能忽略!

今天重装系统,需要重新安装jdk,因为是很久以前安装过,具体的配置方法不是很模糊,所以网上搜索了一些方法配置后,出现了各种各样的问题,其实原因都是很简单的,符号,路径等上面的问题很多,归根究底就是自己...

c++细节决定成败pdf

  • 2013年08月01日 00:55
  • 20.92MB
  • 下载

在谈“细节决定成败”

泰山不拒细壤,故能成其高;江海不择细流,故能就其深。”所以,大礼不辞小让,细节决定成败。         在中国,想做大事的人很多,但愿意把小事做细的人很少;我们不缺少雄韬伟略的战略家,缺少的是精...

C编程规范--细节决定成败

  • 2010年11月10日 22:56
  • 53KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:细节决定成败,浅析一些容易被忽视的Java关键字
举报原因:
原因补充:

(最多只允许输入30个字)