JavaSE-关键字final

final修饰数据:

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

  final修饰的成员变量必需要被初识化函数

  final能够修饰方法中的参数列表,被修饰的参数没法在方法中更改参数引用所指向的对象spa

  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引用的对象的成员域的写入,与随后在构造函数外吧这个被构造对象的引用赋值给一个

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

相关文章
相关标签/搜索