欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java高阶语法---final

程序员文章站 2022-03-20 19:22:54
背景:听说final Java高阶语法是挺进BAT必经之路。 final: final关键字顾名思义就是最终不可改变的。 1、含义:final可以声明成员变量、方法、类和本地变量;一旦将引用声明为final,此引用将不再被改变,编译器会检查代码,如果试图将此变量再次初始化则编译器会报告编译错误。 2 ......

背景:听说final java高阶语法是挺进bat必经之路。

 

final:

final关键字顾名思义就是最终不可改变的。

1、含义:final可以声明成员变量、方法、类和本地变量;一旦将引用声明为final,此引用将不再被改变,编译器会检查代码,如果试图将此变量再次初始化则编译器会报告编译错误。

2、方法:方法前使用final修饰则代表该方法不可被子类的方法重写(private类型的方法默认是final类型的);如果认为一个方法的功能已经很perfect了,子类中不需要再做改变,大可声明此方法为final类型的,因为final方法比非final类型的方法执行速度要快,前者在编译的时候已经静态绑定了,无需在运行时再动态绑定。

3、类:使用final修饰的类通常功能是perfect的,其不能被继承。(java中的final类,如:integer、string、boolean以及其他包装类)这种不可改变类有很多好处,如:它们的对象是只读的,可以在多线程环境下安全共享,不用额外的同步开销等。

4、优势:final关键字可提高性能,jvm和java应用都会缓存final变量;final变量可以安全地在多线程环境下无需额外同步开销实现共享;高效,使用final关键字jvm会对方法、变量及类进行优化,编译器在遇到调用final方法时会转入内嵌机制,大幅度提高了方法执行效率。

我撸了个小例子测试,同样的代码final类型的方法执行用368ms,非final类型的方法用了384ms,有图有据。

Java高阶语法---final

fyi:
import lombok.extern.slf4j.slf4j;
@slf4j
public class testfinal {
    public static void main(string[] args) {
        testfinal.commommethod();
        testfinal.finalmethod();
    }
    public static void commommethod() {
        long starttime = system.currenttimemillis();
        int number = 100000000;
        long amount = 0l;
        for (int i = 0; i < number; i++) {
            amount = amount + i;
        }
        log.info("commommethod's amount is: "+amount);
        long endtime = system.currenttimemillis();
        log.info("commommethod's amount spend time is: "+(endtime-starttime)+"ms");
    }
    public final static void  finalmethod() {
        long starttime = system.currenttimemillis();
        int number = 100000000;
        long amount = 0l;
        for (int i = 0; i < number; i++) {
            amount = amount + i;
        }
        log.info("finalmethod's amount is: "+amount);
        long endtime = system.currenttimemillis();
        log.info("finalmethod‘s amount spend time is: "+(endtime-starttime)+"ms");
    }
}


执行结果:

- commommethod's amount is: 4999999950000000
- commommethod's amount spend time is: 384ms
- finalmethod's amount is: 4999999950000000
- finalmethod‘s amount spend time is: 368ms