final关键字详解

final关键字详解

关于final关键字大部分人通俗的理解是:final是java中的一个关键字,一旦使用这个关键字,就代表不能修改了。

那么问题来了?
1、final修饰类,变量,方法有啥区别?
2、其次说final不可变,那么修饰变量和引用变量的时候什么不可变?
3、使用final关键字有什么好处?

有很多人碰到这几个问题大部分都是一问三不知,我当时就是一问三不知,好尴尬的。

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

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

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

首先说一说final类,举个例子
在这里插入图片描述
当用 final 修饰一个类时,表明这个类不能被继承。你看看到图中箭头指向的地方,那句英文翻译过来就是不能继承 Cat 类。

如果把 final 关键字去掉,就可以了。你看这样就不会报错了!
在这里插入图片描述
final类要注意,一旦被设计成final就无法被继承了!

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

这句话的意思就是说如果方法足够完整,子类不需要修改就可以用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修饰的常量普通变量不可改变,修饰的引用变量引用不可变,引用对象的内容可以改变!

    挨个来说。
    1、首先是final修饰的常量普通变量不可改变。
    举个例子:

    在这里插入图片描述
    上图所示就是被final修饰的普通int变量,想要修改,但是报错。
    2、被final修饰的引用变量引用不可变。
    举例子来说:
    在这里插入图片描述
    从上图可以看出来,test是引用变量,被final修饰,如果再把test这个引用指向别的地方,就报错了!
    3、引用对象的内容可以改变是啥意思呐?
    再来个例子:
    在这里插入图片描述
    这段代码执行结果是2,没有报错,说明test这个对象里面的i的值增加了1,引用对象的内容改变了!

最后,final关键字的好处?
其实好处前面已经说得差不多了,这里总结一下。

  • final方法比非final快
  • final关键字提高了性能。JVM和java应用都会缓存final变量
  • final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
  • 使用final关键字,JVM会对方法、变量及类进行优化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值