zoukankan      html  css  js  c++  java
  • java中final 关键字的作用

    final 关键字的作用

    java中的final关键字可以用来声明成员变量、本地变量、类、方法,并且经常和static一起使用声明常量。

    final关键字的含义:

      final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。

    final 变量:

      凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。下面是final变量的例子:

    public static final String LOAN = "loan";
    LOAN = new String("loan") //invalid compilation error
     
    对于一个fianl变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但是地址中的值是可以改变的。
    如:
    private final int i=0;
      public Demo1() {
       i=1;
       final Object obj=new Object();
       obj=new Object();
      }
     是错的;

    final方法:

    final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。下面是final方法的例子:

    class PersonalLoan{
        public final String getName(){
            return "personal loan";
        }
    }
     
    class CheapPersonalLoan extends PersonalLoan{
        @Override
        public final String getName(){
            return "cheap personal loan"; //compilation error: overridden method is final
        }
    }
     

    final类:

    使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。Java中有许多类是final的,譬如String, Interger以及其他包装类。下面是final类的实例:

    final class PersonalLoan{
     
        }
     
        class CheapPersonalLoan extends PersonalLoan{  //compilation error: cannot inherit from final class
     
    }
     

    final关键字的好处

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

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

    不可变类

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

    相关阅读:为什么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变量就是常量,而且通常常量名要大写:
    1
    private final int COUNT = 10;
    1. 对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容。譬如:
    1
    2
    3
    4
    private final List Loans = new ArrayList();
    list.add(“home loan”);  //valid
    list.add("personal loan"); //valid
    loans = new Vector();  //not valid

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

    思考一个有趣的现象:

           byte b1=1;

           byte b2=3;

           byte b3=b1+b2;//当程序执行到这一行的时候会出错,因为b1、b2可以自动转换成int类型的变量,运算时java虚拟机对它进行了转换,结果导致把一个int赋值给byte-----出错

           如果对b1 b2加上final就不会出错

           final byte b1=1;

           final byte b2=3;

           byte b3=b1+b2;//不会出错  即最终的变量和属性不能被修改。

  • 相关阅读:
    盒子垂直水平居中
    Sahi (2) —— https/SSL配置(102 Tutorial)
    Sahi (1) —— 快速入门(101 Tutorial)
    组织分析(1)——介绍
    Java Servlet (1) —— Filter过滤请求与响应
    CAS (8) —— Mac下配置CAS到JBoss EAP 6.4(6.x)的Standalone模式(服务端)
    JBoss Wildfly (1) —— 7.2.0.Final编译
    CAS (7) —— Mac下配置CAS 4.x的JPATicketRegistry(服务端)
    CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解
    CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
  • 原文地址:https://www.cnblogs.com/tangjiang-code/p/7881805.html
Copyright © 2011-2022 走看看