zoukankan      html  css  js  c++  java
  • Final关键字解析

    final 在 Java 中是一个保留的关键字,可以声明变量方法

    什么是final变量 / 类 / 方法?

    任何变量前被 final 修饰就是 final 变量,定义的类前被 final 修饰就是 final 类,任何方法前被 final 修饰就是final方法。

    final类

    img

    当用 final 修饰一个类时,表明这个类不能被继承。图中箭头指向的地方,那句英文翻译过来就是不能继承 Cat 类。

    如果把 final 关键字去掉,就可以了。这样就不会报错了!

    img

    使用final类要注意,一旦被设置为final类就无法被继承

    final方法

    下面这段话摘自《Java编程思想》第四版第143页:

    “使用 final 方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的 Java 版本中,不需要使用 final 方法进行这些优化“

    意思是如果方法足够完整,子类不需要修改就可以使用final方法,避免子类被修改。final方法是静态绑定的,在编译时就确定好是哪个类的方法,所以final方法要比非final方法快一些

    final变量

    变量被 final 修饰就是就是 final 变量,那么问题来了,final 变量和普通变量到底有啥区别?

    举个栗子:

    public class Main {
       public static void main(String[] args) {
           String a = "xiaomeng2";
           final String b = "xiaomeng";
           String d = "xiaomeng";
           String c = b + 2;
           String e = d + 2;
           System.out.println((a == c));
           System.out.println((a == e));
       }
    }
    

    true

    false

    • 变量a指的是字符串常量池中的 xiaomeng2;
    • 变量 b 是 final 修饰的,变量  b 的值在编译时候就已经确定了它的值,换句话说就是提前知道了变量 b 的内容到底是个啥,相当于一个编译期常量;
    • 变量 c 是 b + 2得到的,由于 b 是一个常量,所以在使用 b 的时候直接相当于使用 b 的原始值(xiaomeng)来进行计算,所以 c 生成的也是一个常量,a 是常量,c 也是常量,都是 xiaomeng2 而 Java 中常量池中只生成唯一的一个 xiaomeng2 字符串,所以 a 和 c 是相等的!
    • d 是指向常量池中 xiaomeng,但由于 d 不是 final 修饰,也就是说在使用 d 的时候不会提前知道 d 的值是什么,所以在计算 e 的时候就不一样了,e的话由于使用的是 d 的引用计算,变量d的访问却需要在运行时通过链接来进行,所以这种计算会在堆上生成 xiaomeng2 ,所以最终 e 指向的是堆上的 xiaomeng2 , 所以 a 和 e 不相等。

    也就是说a和c是常量池的xiaomeng2,e是堆上的xiaomeng2

    final修饰变量和修饰引用变量有什么不同

    final修饰的常量变量不可改变,修饰的引用变量引用不可改变,引用的对象可改变

    举个栗子:

    img

    修改普通变量int报错

    修饰的引用变量引用不可改变是什么意思

    再举个栗子:

    img

    test是引用变量,被final修饰,如果再把test这个引用指向别的地方就会报错

    引用的对象可改变又是什么意思

    举个栗子:

    img

    这段代码执行结果是2,没有报错,说明test这个对象里面i的值增加了1,引用对象的内容变了

    final关键字好处总结:

    • final方法比非final快一些
    • final关键字提高了性能。JVM和Java应用都会缓存final变量。
    • final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
    • 使用final关键字,JVM会对方法、变量及类进行优化。
  • 相关阅读:
    超棒的前端开发界面套件 InK
    现代浏览器的web音频javascript类库 Howler.js
    富有创意的菱形响应式页面设计
    创意味儿十足的web布局及交互设计
    一个超酷的横向多列响应式布局效果
    帮助你生成响应式布局的CSS模板 xyCSS
    免费素材大荟萃:免费图标和UI设计
    使用浏览器生成超棒的midi音乐 midi.js
    JavaScript 和 .NET 中的 JavaScript Object Notation (JSON) 简介
    推荐一批基于web的开源html文本编辑器(40+)
  • 原文地址:https://www.cnblogs.com/zouwangblog/p/11150017.html
Copyright © 2011-2022 走看看