JavaSE-关键字final

final修饰数据:

  final修饰基本数据类型,使数值恒定不变,修饰对象引用,final使引用恒定不变

  final修饰的成员变量必须要被初识化

  final可以修饰方法中的参数列表,被修饰的参数无法在方法中更改参数引用所指向的对象

  final和static修饰的成员变量表示常量

final修饰方法:

  final修饰方法的原因有两个,一是把方法锁定,以防任何继承类修改它的含义,确保在继承中使方法行为保持不变,

  并且不会被覆盖;另一原因是效率。在早期java实现中,如果将方法指明为final,就是同意编译器将针对该方法的

  所有调用都转为内嵌调用。现在的java虚拟机会自动探测到这种情况,不需要通过final修饰方法而提高效率。

  类中所有的private方法都隐式的指定为是final的。

final修饰类:

  类被final修饰,表明该类不能被继承(String就是final的)

final的内存语意:

  final域的重排序规则:

    对于final域,编译器和处理器要遵守两个重排序规则

    (1) 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。

    (2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。

  写final域的重排序规则:

    写final域的重排序规则禁止把final域的写重排序到构造函数之外。这个规则包含两个方面:

    (1)JMM禁止编译器把final域的写重排序到构造函数之外。

    (2)编译器会在final域的写之后,构造函数returen之前,插入一个StoreStore屏障。这个屏障禁止处理器把final域的写重排序

     到构造函数之外。

  读final域的重排序规则:

    读final域的重排序规则是,在一个线程中,初次读对象引用与初次读该对象包含的final域,JMM禁止处理器重排序这两个操作

    (这个规则仅针对处理器)。编译器会在读final域操作的前面插入一个LoadLoad屏障。

  final域为引用类型:

    上面讲到的都是基础数据类型,那么对于引用类型是怎样的呢?对于引用类型,写final域的重排序规则对编译器和处理器增加

    了如下约束:在构造函数内对一个final引用的对象的成员域的写入,与随后在构造函数外吧这个被构造对象的引用赋值给一个

    引用变量,这两个操作之间不能重排序。

posted @ 2018-11-13 06:41  寻找风口的猪  阅读(247)  评论(0编辑  收藏  举报