基础储备----Java关键字final

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BraveLoser/article/details/82391420

1. 前言

阅读Java源码或者日常后台开发中, 会不可避免的与final打交道, 那么final关键字究竟有哪些特性?这篇文章主要介绍final关键字及其相关知识点.

2. 基本用法

在Java中, final可以用来修饰类,方法和变量(包括成员变量和局部变量). 我们先来简单介绍一下final关键字的这几个用法.

2.1 final修饰类

常见的一个例子就是String类. 当用final修饰一个类时, 表明这个类不能被继承, 并且final类中的所有成员方法都会被隐式地指定为final方法, 但成员变量不会变.
一般来说, 我们还是尽量不要将类设计为final类, 除非我们出于某些因素的考虑必须这么做. 比如不希望类被继承, 也就是说不希望类被修改语义. 如果我们继承String类, 那么就可以定义一个可被修改的String类, 这对于String类的使用者来说近乎是一种灾难.

2.2 final修饰方法

使用final修饰方法有两个原因:
一是把方法锁定, 以防任何继承类修改它的含义;
二是效率. 在早期的Java实现版本中, 会将final方法转为内嵌调用. 但是如果方法过于庞大, 可能看不到内嵌调用带来的任何性能提升. 在最近的Java版本中, 不需要使用final方法进行这些优化了.
同final类相似, 只有在想明确禁止该方法在子类中被覆盖的情况下才将方法设置为final. 另外,类 的private方法会隐式地被指定为final方法, 其语义要求private方法不能被重新定义.

2.3 final修饰变量

final用得最多的地方就是修饰变量. 对于一个final变量, 如果是基本数据类型的变量, 则其数值一旦在初始化之后便不能更改;如果是引用类型的变量, 则在对其初始化之后便不能再让其指向另一个对象, 但是它指向的对象的内容是可变的.
由于final变量初始化之后无法修改, 针对这个特性, Java编译器对此进行了优化. 当final变量是基本数据类型以及String类型时, 如果在编译期间能知道它的确切值, 则编译器会把它当做编译期常量使用. 这个优化通常对于程序逻辑没有太多影响, 但如果用==比较的时候, 可能会出乎意料.

3. 总结

综上所述, final在修饰类和方法时, 代表不能再修改其定义, 而在修饰变量时, 则类似C++中的const关键字, 用于表示常量.
一个好的编程习惯是我们应该尽量将变量声明为final的, 除非变量必须是可变的. 例如当你在方法中不需要改变作为参数的变量时, 可以使用final进行声明, 这样可以防止你无意的修改, 尤其是当你的方法很长很复杂的时候. 当然是否用final修饰参数, 都不会影响方法之外的变量.

4. 参考链接

https://www.cnblogs.com/pkufork/p/java_final.html

猜你喜欢

转载自blog.csdn.net/BraveLoser/article/details/82391420