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

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

  • 相关阅读:
    java中获取类资源的不同姿势
    Jdk动态代理与Cglib动态代理
    Spring AOP
    Spring Ioc、DI
    windows 8.1 专业版 visual stuido 2015 安装失败
    win7 共享需要密码问题
    protobuffer .net 序列化
    【转载】SQL Server 2005数据库用户权限管理的设置
    【转载】mongoDB基本使用手册
    【转载】Thread.sleep(0)的意义
  • 原文地址:https://www.cnblogs.com/happyflyingpig/p/9950283.html
Copyright © 2011-2022 走看看