前言

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 关键字的作用相关推荐

  1. 一文搞懂Volatile关键字的作用

    前言 Volatile关键字的作用主要有如下两个: 1.线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值. 2. 顺序一致性:禁止指令重排序. 一.线程可见性 我们先通过一个 ...

  2. 一文搞懂transient关键字

    一文搞懂transient关键字 1.序列化 1.1 什么是序列化 1.2 以文件存储为例实现序列化 2.transient关键字 2.1 添加transient关键字 2.2 静态变量不需要加tra ...

  3. 【Java基本功】一文读懂final关键字的用法

    本文主要介绍了final关键字的基本使用方法及原理 final关键字可以修饰类.方法和引用. 修饰类,该类不能被继承.并且这个类的对象在堆中分配内存后地址不可变. 修饰方法,方法不能被子类重写. 修饰 ...

  4. 【Java基本功】一文读懂final关键字的用法 1

    本文主要介绍了final关键字的基本使用方法及原理 final关键字可以修饰类.方法和引用. 修饰类,该类不能被继承.并且这个类的对象在堆中分配内存后地址不可变. 修饰方法,方法不能被子类重写. 修饰 ...

  5. 网络知识扫盲,一文搞懂 DNS

    在找工作面试的过程中,面试官非常喜欢考察基础知识,除了数据结构与算法之外,网络知识也是一个非常重要的考察对象. 而网络知识,通常是很抽象,不容易理解的,有很多同学就在这里裁了跟头.为了更好地通过面试, ...

  6. 都2021年了,再不学ES6你就out了 —— 一文搞懂ES6

    JS干货分享 -- 一文搞懂ES6 导语:ES6是什么?用来做什么? 1. let 与 const 2. 解构赋值 3. 模板字符串 4. ES6 函数(升级后更爽) 5. Class类 6. Map ...

  7. ES6学习——一文搞懂ES6

    ES6学习--一文搞懂ES6 es6介绍 ES全称EcmaScript,是脚本语言的规范,而平时经常编写的EcmaScript的一种实现,所以ES新特性其实就是指JavaScript的新特性. 为什么 ...

  8. 一文搞懂 MySQL 索引

    一文搞懂 MySQL 索引 1.MySQL 索引 简介 1.1.MySQL 索引 是什么?  索引是一个单独的.存储在 磁盘 上的 数据库结构 ,包含着对数据表里 所有记录的 引用指针. 1.2. M ...

  9. 一文搞懂 checkpoint 全过程

    前言 前面我们讲解了 一文搞懂 Flink 处理 Barrier 全过程 和 一文搞定 Flink Checkpoint Barrier 全流程 基本上都是跟 checkpoint 相关.这次我们就具 ...

最新文章

  1. TVM编译机器学习到 WASM 和 WebGPU
  2. [OpenCV]直线拟合
  3. 12 HTML5中的影音播放
  4. C++ 关键字new
  5. 【Linux】Linux下建立和管理逻辑卷
  6. 第十二章_请求和响应的装饰
  7. jquery ajax返回html乱码解决
  8. 大数据_Hbase-API访问_Java操作Hbase_数据操作_表删除_表获取所有数据---Hbase工作笔记0014
  9. IPython notebook(Jupyter Notebook) 的使用
  10. [转]Python中RE模块的应用
  11. Python性能加速
  12. php txt投票功能,php查询操作实现投票功能
  13. 中国计算机学会推荐国际学术会议和期刊(A类)2019年
  14. 如何获得复权后的股票数据
  15. 进程控制 父进程子进程 fork pid
  16. 知识图谱从入门到应用——知识图谱的应用
  17. 微信公众号开发【一】 菜单获取与设置
  18. 人民币小写金额转大写
  19. CSS基本布局——grid布局
  20. 自动化测试框架的完整指南【译】

热门文章

  1. 信息学奥赛一本通C++语言——1107:校门外的树
  2. 信息学奥赛C++语言:格莱尔的香蕉
  3. 50 MM配置-库存管理和实际库存-自动建立库存地点
  4. 鸿蒙开发版智慧生活,华为发布全新分布式鸿蒙OS,打造全场景智慧生活新体验...
  5. C语言 memcpy函数(增加dst 从第一字节拷贝判断)的内部简单实现方式
  6. ubuntu升级python_Ubuntu 系统下可以做什么?——拥抱自由和安静
  7. 递归调用层数太多_VBA学习笔记46:组合之递归算法(没写后补)
  8. h5键盘把页面顶走了_微信h5开发的坑
  9. RabbitMQ单机瞎玩(1)
  10. linux那些事之LRU(1)