面试:一文搞懂 final 关键字的作用
前言
Java语言支持的变量类型有:
- 类变量:独立于方法之外的变量,用 static 修饰。
- 实例变量:独立于方法之外的变量,不过没有 static 修饰。
- 局部变量:类的方法中的变量。
实例代码:
public class Student{static int id = 1; // 类变量String str="hello"; // 实例变量public void method(){int i = 0; // 局部变量}
}
大概了解以上知识点,废话不多说,我们就直接上干货吧。
面试官:说一说 final 关键字的作用
1、被final修饰的变量不可以被改变
上面我们说了变量类型有三种:那我们就以类变量来举个列子
@Data
public class Student {// 类变量private final Integer id = 1;// 学生姓名private String stuName;
}
此时我们创建了一个学生类,并且它的属性id我们使用了final关键字进行修饰。
我们知道使用final修饰符修饰的变量的特点:该变量会变成常量,值不能被改变,也就是说必须赋予初始值。这里我们使用了final 修饰、也赋予了id初始值
private final Integer id = 1;
条件满足、测试一波
public class Fun {public static void main(String[] args) {// 获取对象Student student = new Student();System.out.println(student);}
}
控制台打印输出,哈哈,意料之中,毫无惊喜可言
Student(id=1, stuName=null)
那么可能小伙伴会问,被final修饰的变量 满足了,达到了预期结果,那它怎么不可以改变呢?
我刚刚使用了lombok插件,该Student类,使用@Data注解自动为我们生成get、set等方法、我们可以查看它的编译后的class文件。
细心的小伙伴可以发现,编译后的class文件,Student类的属性id没有set方法,那不就清楚了,不可以改变值 是不是得到验证了。
2、被 final 修饰的类不可以被继承
大千世界、万物皆对象,通过Java的反射机制,我们拿到对象,既可以操作其属性及方法。
反证法:College子类继承Student父类,(子类继承父类,从已有的类得到继承信息创建新类的过程),Student类下我们编写num方法
@Data
public class Student {// 类变量private final Integer id = 1;// 学生姓名private String stuName;// 一个num方法public Integer num(Integer a, Integer b){return a + b;}
}
College类继承Student类(子类继承父类)
public class College extends Student{public Integer num(Integer a, Integer b){return a + b;}}
测试
public class Fun{public static void main(String[] args) {// 获取对象College college = new College();Integer num = college.num(1, 2);System.out.println(String.format("result:%s",num));}
}
result:3
程序正常,可以看到通过College类继承Student父类,我们成功调用了num方法。如果我们将Student类加final关键字进行修饰。
public final class Student
无法从final 修饰的类中继承,验证了被 final 修饰的类不可以被继承。
3、被 final 修饰的方法不可以被重写
还记得上面的我们的num方法吗?就是简单的计算两个整数之和。
此时我们在College子类中重写该方法。
测试
控制台输出结果
result:2
此时我们的num方法,并没有被final修饰,并且我们在继承父类的时候,重写了num方法。
如果此时我们将num方法用final关键字进行修饰,那么还能重写吗?当然那是不可以的。
此时我们也验证了,被 final 修饰的方法不可以被重写。
文章总结
被 final 修饰的类不可以被继承,被 final 修饰的方法不可以被重写,被 final 修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.被 final 修饰的方法,JVM 会尝试将其内联,以提高运行效率,被 final 修饰的常量,在编译阶段会存入常量池中。
最后
如果你觉得DT_小白文章写的还不错,请微信搜索并关注「 Java云社 」微信公众号,和DT_小白一起学习Java、分布式、微服务、大数据技术,并且「 Java云社 」收集了大量的大厂面试题目集,等你来挖掘,为了提升自己的能力,实现技术能力的飞跃,每天定时更新超硬核技术干货,我在「 Java云社 」等您的加入,让我们共同学习吧!
面试:一文搞懂 final 关键字的作用相关推荐
- 一文搞懂Volatile关键字的作用
前言 Volatile关键字的作用主要有如下两个: 1.线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值. 2. 顺序一致性:禁止指令重排序. 一.线程可见性 我们先通过一个 ...
- 一文搞懂transient关键字
一文搞懂transient关键字 1.序列化 1.1 什么是序列化 1.2 以文件存储为例实现序列化 2.transient关键字 2.1 添加transient关键字 2.2 静态变量不需要加tra ...
- 【Java基本功】一文读懂final关键字的用法
本文主要介绍了final关键字的基本使用方法及原理 final关键字可以修饰类.方法和引用. 修饰类,该类不能被继承.并且这个类的对象在堆中分配内存后地址不可变. 修饰方法,方法不能被子类重写. 修饰 ...
- 【Java基本功】一文读懂final关键字的用法 1
本文主要介绍了final关键字的基本使用方法及原理 final关键字可以修饰类.方法和引用. 修饰类,该类不能被继承.并且这个类的对象在堆中分配内存后地址不可变. 修饰方法,方法不能被子类重写. 修饰 ...
- 网络知识扫盲,一文搞懂 DNS
在找工作面试的过程中,面试官非常喜欢考察基础知识,除了数据结构与算法之外,网络知识也是一个非常重要的考察对象. 而网络知识,通常是很抽象,不容易理解的,有很多同学就在这里裁了跟头.为了更好地通过面试, ...
- 都2021年了,再不学ES6你就out了 —— 一文搞懂ES6
JS干货分享 -- 一文搞懂ES6 导语:ES6是什么?用来做什么? 1. let 与 const 2. 解构赋值 3. 模板字符串 4. ES6 函数(升级后更爽) 5. Class类 6. Map ...
- ES6学习——一文搞懂ES6
ES6学习--一文搞懂ES6 es6介绍 ES全称EcmaScript,是脚本语言的规范,而平时经常编写的EcmaScript的一种实现,所以ES新特性其实就是指JavaScript的新特性. 为什么 ...
- 一文搞懂 MySQL 索引
一文搞懂 MySQL 索引 1.MySQL 索引 简介 1.1.MySQL 索引 是什么? 索引是一个单独的.存储在 磁盘 上的 数据库结构 ,包含着对数据表里 所有记录的 引用指针. 1.2. M ...
- 一文搞懂 checkpoint 全过程
前言 前面我们讲解了 一文搞懂 Flink 处理 Barrier 全过程 和 一文搞定 Flink Checkpoint Barrier 全流程 基本上都是跟 checkpoint 相关.这次我们就具 ...
最新文章
- TVM编译机器学习到 WASM 和 WebGPU
- [OpenCV]直线拟合
- 12 HTML5中的影音播放
- C++ 关键字new
- 【Linux】Linux下建立和管理逻辑卷
- 第十二章_请求和响应的装饰
- jquery ajax返回html乱码解决
- 大数据_Hbase-API访问_Java操作Hbase_数据操作_表删除_表获取所有数据---Hbase工作笔记0014
- IPython notebook(Jupyter Notebook) 的使用
- [转]Python中RE模块的应用
- Python性能加速
- php txt投票功能,php查询操作实现投票功能
- 中国计算机学会推荐国际学术会议和期刊(A类)2019年
- 如何获得复权后的股票数据
- 进程控制 父进程子进程 fork pid
- 知识图谱从入门到应用——知识图谱的应用
- 微信公众号开发【一】 菜单获取与设置
- 人民币小写金额转大写
- CSS基本布局——grid布局
- 自动化测试框架的完整指南【译】
热门文章
- 信息学奥赛一本通C++语言——1107:校门外的树
- 信息学奥赛C++语言:格莱尔的香蕉
- 50 MM配置-库存管理和实际库存-自动建立库存地点
- 鸿蒙开发版智慧生活,华为发布全新分布式鸿蒙OS,打造全场景智慧生活新体验...
- C语言 memcpy函数(增加dst 从第一字节拷贝判断)的内部简单实现方式
- ubuntu升级python_Ubuntu 系统下可以做什么?——拥抱自由和安静
- 递归调用层数太多_VBA学习笔记46:组合之递归算法(没写后补)
- h5键盘把页面顶走了_微信h5开发的坑
- RabbitMQ单机瞎玩(1)
- linux那些事之LRU(1)