Java的final关键字详解建议收藏

Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例。final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的。

final关键字的含义?

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

什么是final变量?

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

public static final String LOAN = “loan” ;
LOAN = new String( “loan” ) //invalid compilation error

final变量是只读的。

什么是final方法?

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

 1 class PersonalLoan{
 2 public final String getName(){
 3 return "personal loan" ;
 4 }
 5 }
 6 
 7 //http://www.cnblogs.com/roucheng/
 8 
 9 class CheapPersonalLoan extends PersonalLoan{
10 @Override
11 public final String getName(){
12 return "cheap personal loan" ; //compilation error: overridden method is final
13 }
14 }

 

什么是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关键字的好处

final关键字提高了性能。JVM和Java应用都会缓存final变量。

final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

使用final关键字,JVM会对方法、变量及类进行优化。

不可变类

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

相关阅读:为什么String是不可变的以及如何写一个不可变类。

关于final的重要知识点

final关键字可以用于成员变量、本地变量、方法以及类。

final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。

你不能够对final变量再次赋值。

本地变量必须在声明时赋值。

在匿名类中所有变量都必须是final变量。

final方法不能被重写。

final类不能被继承。

final关键字不同于finally关键字,后者用于异常处理。

final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。

接口中声明的所有变量本身是final的。

final和abstract这两个关键字是反相关的,final类就不可能是abstract的。

final方法在编译阶段绑定,称为静态绑定(static binding)。

没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。

将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。

按照Java代码惯例,final变量就是常量,而且通常常量名要大写:

private final int COUNT = 10 ;

对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容。譬如:

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,能写出更快、更好的代码的。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120742.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Taglib自定义万能标签扩展 DownLoad

    Taglib自定义万能标签扩展 DownLoad

    2021年10月23日
  • 数据库锁表如何解决_mysql数据库怎么解锁

    数据库锁表如何解决_mysql数据库怎么解锁这个问题之前遇到过一次,但是由于不知道导致锁表的原因,也没细想,就知道表被锁了,然后让别人把表给解锁了。但是前天的一次操作,让我亲眼见证了导致锁表的过程,以及如何给lock的表解锁。1.导致锁表的原因(同志们也可以参考是不是也是同样的操作啊。。。):1.1首先是大前提我们正常的框架在service层都会有事物控制,比如我一个service层的方法要执行更新两张表,这两个表只有同…

    2022年8月23日
  • jrtplib linux编译,linux下jrtplib-3.9.1编译与安装.txt[通俗易懂]

    一、安装包准备1、进入官网http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib下载jrtplib-3.9.1.tar.gz包,路径为:http://research.edm.uhasselt.be/jori/jrtplib/jrtplib-3.9.1.tar.gz注意:Download下边有一段话:Thelibrar…

    2022年4月10日
  • rsync备份大量数据_SnapShot能做增量备份吗

    rsync备份大量数据_SnapShot能做增量备份吗文章目录一、rsync简介二、实验过程三、rsync命令四、编译安装包下载一、rsync简介  sync是一个常用的Linux应用程序,用于文件同步。它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp和mv命令。  它名称里面的r指的是remote,rsync其实就是“远程同步”(remotesync)的意思。与其他文件传输工具(如FTP或scp)不同,rsync的最大特点是

    2022年10月13日
  • 集合转数组[通俗易懂]

    集合转数组[通俗易懂]LinkedListl=newLinkedList();l.add(“one”);l.add(“two”);l.add(“three”);System.out.println(l);Object[]c=l.toArray();for(inti=

    2022年6月14日
  • 风控模型面试问题[通俗易懂]

    风控模型面试问题[通俗易懂]本文转自他人作者:SummerMemories个人公众号:风控汪的数据分析之路知乎专栏:小鑫的数据分析笔记Q:互联网金融场景下的的风控模型种类?获客阶段:用户响应模型,风险预筛选模型。授信阶段:申请评分模型,反欺诈模型,风险定价模型,收益评分模型。贷后阶段:行为评分模型,交易欺诈模型,客户流失模型。催收阶段:早期催收模型,晚期催收模型。Q:简单描述一下风控建模的流程?前期准备…

    2022年6月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号