zoukankan      html  css  js  c++  java
  • java基础 -- 关键字final的用法

    用法一(修饰变量):

      Final变量能被显式地初始化并且只能初始化一次。被声明为final的对象的引用不能指向不同的对象。但是final对象里的数据可以被改变。也就是说final对象的引用不能改变,但是里面的值可以改变。

      总得来说对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

      Final修饰符通常和static修饰符一起使用来创建类常量。

      1.修饰基本数据类型的变量时

    package com.java_final;
    
    public class FinalOne {
        
        //声明一个fianl修饰的基本数据类型的变量
        final int count = 1;
        
        public static void main(String[] args) {
            // 重新给count赋值,编译报错
            // 因为count是基本数据类型,则其数值一旦在初始化之后便不能更改
            count = 2;
        }
    }

      2.修饰引用类型的变量时

    package com.java_final;
    
    public class FinalOne {
        
        public static void main(String[] args) {
            // fianl修饰的引用类型的变量
            final StringBuffer sb = new StringBuffer("abc");
            System.out.println("sb中的内容:" + sb +"===========>对应的哈希码:" + sb.hashCode());
            // 编译时报错,引用不能变
            //sb = new StringBuffer("aaa");
            
            // 引用的对象中的内容是可以改变的
            sb.append("def");
            System.out.println("sb中的内容:" + sb +"===========>对应的哈希码:" + sb.hashCode());
            
            //output
            //sb中的内容:abc===========>对应的哈希码:2018699554
            //sb中的内容:abcdef===========>对应的哈希码:2018699554
            // 我们可以看到引用对象中的内容改变了,但是哈希码值是不变的,所以引用变量所指向的对象中的内容还是可以改变的
        }
    }

    用法二(修饰方法):

      类中的Final方法可以被子类继承,但是不能被子类修改,声明final方法的主要目的是防止该方法的内容被修改。

      因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。即父类的final方法是不能被子类所覆盖的,也就是说子类是不能够存在和父类一模一样的方法的。

          final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。此处需要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同时访问控制权限为private,将会导致子类中   不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。(注:类的private方法会隐式地被指定为final方法。)

    public class B extends A {
    
        public static void main(String[] args) {
    
        }
    
        public void getName() {
            
        }
    }
    
    class A {
    
        /**
         * 因为private修饰,子类中不能继承到此方法,因此,子类中的getName方法是重新定义的、
         * 属于子类本身的方法,编译正常
         */
        private final void getName() {
            
        }
    
        /* 因为public修饰,子类可以继承到此方法,导致重写了父类的final方法,编译出错
        public final void getName() {
        
        }
        */
    }

    用法三(修饰类):

      在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。  

      Final类不能被继承,没有类能够继承final类的任何特性,如果一个类你永远不会让他被继承,就可以用final进行修饰,

      final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法,

    final关键字的好处

    下面总结了一些使用final关键字的好处

    1. final关键字提高了性能。JVM和Java应用都会缓存final变量。
    2. final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
    3. 使用final关键字,JVM会对方法、变量及类进行优化。

    不可变类

    创建不可变类要使用final关键字。不可变类是指它的对象一旦被创建了就不能被更改了。String是不可变类的代表。不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。

    关于final的重要知识点

    1. final关键字可以用于成员变量、本地变量、方法以及类。
    2. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
    3. 你不能够对final变量再次赋值。
    4. 本地变量必须在声明时赋值。
    5. 在匿名类中所有变量都必须是final变量。
    6. final方法不能被重写。
    7. final类不能被继承。
    8. final关键字不同于finally关键字,后者用于异常处理。
    9. final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
    10. 接口中声明的所有变量本身是final的。
    11. final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
    12. final方法在编译阶段绑定,称为静态绑定(static binding)。
    13. 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
    14. 将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。
    15. 按照Java代码惯例,final变量就是常量,而且通常常量名要大写:
      private final int COUNT = 10;
       
       

      我们已经知道final变量、final方法以及final类是什么了。必要的时候使用final,能写出更快、更好的代码的。

      参考资料:https://www.cnblogs.com/xiaoxi/p/6392154.html

           https://www.cnblogs.com/z-sm/p/5278254.html

      

      

  • 相关阅读:
    swift 第十四课 可视化view: @IBDesignable 、@IBInspectable
    swift 第十三课 GCD 的介绍和使用
    swift 第十二课 as 的使用方法
    swift 第十一课 结构体定义model类
    swift 第十课 cocopod 网络请求 Alamofire
    swift 第九课 用tableview 做一个下拉菜单Menu
    swift 第八课 CollectView的 添加 footerView 、headerView
    swift 第七课 xib 约束的优先级
    swift 第六课 scrollview xib 的使用
    swift 第五课 定义model类 和 导航栏隐藏返回标题
  • 原文地址:https://www.cnblogs.com/2016-10-07/p/8399952.html
Copyright © 2011-2022 走看看