final 关键字,你想知道的都在这里
哈喽,大家好,我是指北君。
介绍完 native、static 关键字后,指北君马不停蹄,接着为大家介绍另一个常用的关键字——final。
对于Java中的 final 关键字,我们首先可以从字面意思上去理解,百度翻译显示如下:

也就是说 final 英文意思表示是最后的,不可更改的。那么对应在 Java 中也是表达这样的意思,可以用 final 关键字修饰变量、方法和类。不管是用来修饰什么,其本意都是指 “它是无法更改的”,这是我们需要牢记的,为什么要无法更改?无非就是设计所需或者能提高效率,与前面介绍 static 关键字需要记住其与对象无关的理念一样,牢记 final 的不可变的设计理念后再来了解 final 关键字的用法,便会顺其自然了。
1、修饰变量
稍微有点Java基础的都知道用final关键字修饰的变量称为常量,常量的意思是不可更改。变量为基本数据类型,不可更改很容易理解,那么对于引用类型呢?不可能改的是其引用地址,还是对象的内容?
我们首先构造一个实体类:Person
package com.ys.bean;
/**
* Create by YSOcean
*/
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
接着根据创建一个 Person 对象:

可以看到,首先通过 final 关键字修饰一个对象 p,然后接着将 p 对象指向另一个新的对象,发现报错,也就是说final修饰的引用类型是不能改变其引用地址的。
接着我们改动 p 对象的 name 属性:

发现程序没有报错。
结论:被 final 修饰的变量不可更改其引用地址,但是可以更改其内部属性。
2、修饰方法
final 关键字修饰的方法不可被覆盖。
在《Java编程思想》第 4 版 7.8.2 章节 final 方法p176 页这样描述:使用 final 方法原因有两个:
①、第一个原因是把方法锁定,以防止任何继承类修改它的含义,这是出于设计的考虑:想要确保在继承中使方法的行为保持不变,并且不会被覆盖。
②、第二个原因是效率,在 Java 的早期实现中,如果将一个方法声明为 final,就是同意编译器将针对该方法的所有调用都转为内嵌调用,内嵌调用能够提高方法调用效率,但是如果方法很大,内嵌调用不会提高性能。而在目前的Java版本中(JDK1.5以后),虚拟机可以自动进行优化了,而不需要使用 final 方法。
所以final 关键字只有明确禁止覆盖方法时,才使用其修饰方法。
PS:《Java编程思想》中指出类中所有的 private 方法都隐式指定为 final 的,所以对于 private 方法,我们显式的声明 final 并没有什么效果。但是我们创建一个父类,并在父类中声明一个 private 方法,其子类中是能够重写其父类的private 方法的,这是为什么呢?
父类:Parent.class
package com.ys.bean;
/**
* Create by YSOcean
*/
public class Parent {
private void say(){
System.out.println("parent");
}
}
子类:Son.class
package com.ys.bean;
/**
* Create by YSOcean
*/
public class Son extends Parent {
private void say(){
System.out.println("son");
}
}
其实仔细看看,这种写法是方法的覆盖吗?我们通过多态的形式并不能调用到父类的 say() 方法:

并且,如果我们在子类的 say() 方法中,添加 @Override 注解也是会报错的。

所以这种形式并不算方法的覆盖。
3、修饰类
final 修饰类表示该类不可被继承。
也就是说不希望某个类有子类的时候,用final 关键字来修饰。并且由于是用 final 修饰的类,其类中所有的方法也被隐式的指为 final 方法。
在 JDK 中有个最明显的类 String ,就是用 final 修饰的,将 String 类用 final 修饰很重要的一个原因是常量池。关于 String 类的描述,可以参考我前面文章。
4、小结
好了,这就是Java中对 final 关键词的介绍,总之记住一句话,final 修饰的就是不可变的。
指北君后续的文章会给大家介绍Java中的各种关键字。
我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!
final 关键字,你想知道的都在这里的更多相关文章
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 浅析final 关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- [转载]浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 转载:浅析Java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- 浅析Java中的final关键字(转)
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- 【Java学习笔记之二十】final关键字在Java继承中的用法小结
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...
- 浅谈Java中的final关键字
浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 【转】浅析Java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...
- java浅析final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...
随机推荐
- 【开发工具】-- IDEA集成Git在实际项目中的运用
1.企业实际项目中Git的使用 在实际的企业项目开发中,我们一般Java的项目在公司都有自己的局域网代码仓库,仓库上存放着很多的项目.以我工作过的公司如华为的项目,一般是存放在企业内部的CodeHub ...
- 微信小程序云开发-数据库-列表页携带id跳转到详情页
一.新建页面 新建列表页"pages/goodslist/goodslist",新建列表详情页"pages/gooddetail/gooddetail" 二. ...
- java.io.NotSerializableException:异常解决
创建的pojo类未实现Serializable接口,启动服务器会报此异常. 解决此问题 添加一个Serializable接口即可 1 import java.io.Serializable; 2 3 ...
- 痞子衡嵌入式:i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计. 痞子衡之前两篇文章 <在SBL项目实战中妙用i ...
- javascript学习笔记-(三)
ES6标准新增了一种新的函数:Arrow Function(箭头函数) 案例: 为什么叫Arrow Function?因为它的定义用的就是一个箭头: x => x * x 上面的箭头函数相当于: ...
- 渗透测试思路 - CTF(番外篇)
渗透测试思路 Another:影子 (主要记录一下平时渗透的一些小流程和一些小经验) CTF(番外篇) 笔者是一个WEB狗,更多的是做一些WEB类型题目,只能怪笔者太菜,哭~~ 前言 本篇 ...
- Unity3D学习笔记3——Unity Shader的初步使用
目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...
- 用webpack发布一个vue插件包
创建库 本来以为很简单,结果配置了webpack之后,运行build就报错了,似乎不认识es6语法,于是先后安装了几个包: @babel/core @babel/preset-env babel-lo ...
- ETL数仓测试
前言 datalake架构 离线数据 ODS -> DW -> DM https://www.jianshu.com/p/72e395d8cb33 https://www.cnblogs. ...
- 群晖NAS网络存储服务器防盗防小偷
群晖NAS网络存储服务器防盗防小偷 根据群晖NAS的实际测量外形尺寸到淘宝网邮购金属 配电箱(弱电箱). 把配电箱(弱电箱)用粗螺丝固定到机柜或墙壁上. 把群晖NAS用密码纯铜挂锁锁在配电箱(弱电箱 ...