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

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

  • 相关阅读:
    敏捷开发 之 计划、测试 与 重构
    敏捷开发 之 理论概述篇
    第二十章 排查和调试Web程序 之 设计异常处理策略
    第十九章 排查和调试Web程序 之 防止和排查运行时问题
    第十八章 提升用户体验 之 减少带宽占用
    第十七章 提升用户体验 之 使用MVC扩展功能控制程序行为
    第十六章 提升用户体验 之 设计实现routes
    第十五章 提升用户体验 之 设计实现MVC controllers 和 actions
    第十四章 提升用户体验 之 设计实现国际化和本地化
    Nginx系统学习笔记(3)同一端口下设置Alias(虚拟目录)
  • 原文地址:https://www.cnblogs.com/happyflyingpig/p/9950283.html
Copyright © 2020-2023  润新知