疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

浅析容易被忽视的Java关键字


 

   

  一、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却显式指明了方法是无实现体的。

  三、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保证并发数据安全的同时需要付出效率的代价,所以一定要在需要时才使用这个关键字。