zoukankan      html  css  js  c++  java
  • final关键字与不变性

    1.大纲

      不变性

      final的作用

      3种变量

      注意点

      不变性与final的关系

    一:不变性

    1.说明

      如果某个对象被创建,状态就不能被修改,那么它就是不可变的

      具有不可变性的对象一定是线程安全的,不需要安全措施,也能保证线程安全

      

    二:final的作用

    1.功能

      类上可以防止被继承

      方法可以防止被重写

      变量防止被修改

      可以不需要额外的同步开销【当前的jvm已经很智能优化了】

      所以,这里更多的是在语义上说明,希望修饰的不可被改变,良好的变成习惯

    2.fiannl修饰的变量

      意味着值不能被修改。

      但是,如果变量时对象,那么对象的引用不能变,对象自身的内容是可以变化的

    3.三种变量

      类中的:

        必须初始化变量

        赋值时机:在等号右边,构造函数,初始化代码块

      类中static:

        必须初始化变量

        赋值时机:等号右边,静态初始化代码块【要加上static】

      方法中的:

        赋值时机:要求使用前要赋值

      

    4.为啥要先赋值

      因为初始化不赋值,后续赋值,就从null变成了新的赋值,违反了final不变的原则了

    5.修饰方法

      不能修饰构造方法

      不可被重写,就是不能被override,编译器不会给展示出来

      

    6.修饰类

      不可以被继承

      典型的String类就是final的

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
    
        /** Cache the hash code for the string */
        private int hash; // Default to 0
    
        /** use serialVersionUID from JDK 1.0.2 for interoperability */
        private static final long serialVersionUID = -6849794470754667710L;
    

      

    三:不变性与final的关系

    1.说明

      不变性不是意味着,简单的用final修饰就是不可变

      对于基本类型,被final修饰了,就的确有了不变性

    2.如何实现对象的不可变

      是否里面的属性都final就可以不可变了?

        是不对的,因为里面的属性可能还是对象,对象就可以变化

      只要对象没有机会被修改,就是不可变的

    3.总结

      对象创建后,状态不能修改

      所有的属性都是final的

      对象创建过没有发生逸出

    4.栈封闭技术

      在方法里新建的局部变量,实际上市存在每个线程私有的栈空间,每个栈空间都是不能被其他的线程所访问的,不会有线程问题

      

      

      

  • 相关阅读:
    MAC OS 快捷键一览
    JavaScript检测实例属性, 原型属性
    jQuery $.each用法
    双击和单击事件冲突解决方法
    移动WEB前端开发资源整合
    纯CSS3实现自定义涂鸦风格的边框
    jquery如何阻止子元素相应mouseout事件
    jquery键盘事件全记录
    javascript类型系统之基本数据类型与包装类型
    经验分享:CSS浮动(float,clear)通俗讲解
  • 原文地址:https://www.cnblogs.com/juncaoit/p/13082192.html
Copyright © 2011-2022 走看看