面试官:小伙子来说一说Java中final关键字,以及它和finally、finalize()有什么区别?
写在开头
面试官:“小伙子,用过final关键字吗?”
我:“必须用过呀”
面试官:“好,那来说一说你对这个关键字的理解吧,再说一说它与finally、finalize()的区别”
我:“好嘞!”
final中文释义:最终的,最后的;在Java中作为关键字的一种,被用来修饰变量、方法、类,final 语义是不可改变的。
final修饰变量
当final修饰变量时有如下几点需要注意:
1、final 修饰表示常量、一旦创建不可改变;
2、final 修饰的局部变量必须在声明时给定初值;
3、final 修饰的成员变量必须在声明时给定初值或者在构造方法内设置初始值,只能读取,不可修改;
4、被 final 修饰的成员变量必须要初始化,赋初值后不能再重新赋值(可以调用对象方法修改属性值)。
对基本类型来说是其值不可变;对引用变量来说其引用不可变,即不能再指向其他的对象;
【代码示例】
public class Test {
private String name;
public final int age = 18;
//和static一同修饰时,被当做常量
private static final int HIGH = 180;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getWeight(){
final int weight;
//修饰局部变量时,不能再赋值,需要在声明时给定初始值!
return weight;
}
public static void main(String[] args) {
final Test test = new Test();
// 给一个被final修饰的引用类型重新赋值,编译器会报错,提示取消final修饰
//test = new Test();
// 但给这个引用类型进行属性赋值是可以的!
test.setName("JavaBuild");
//final修饰的成员变量,给定初始值后不可再修改,但可以调用
if(test.age == 18){
System.out.println("永远18岁");
}
}
}
final修饰方法
当final修饰方法时需要注意:
1、final修饰的方法:只能使用,不能被子类重写,但能够类内重载;
【代码示例】
public class Test extends Animal{
//方法的重写不被允许
public void run(){
}
}
class Animal {
public final void run(){
System.out.println("我会跑");
}
//方法的重载,被允许
public final void run(String dog){
System.out.println("我会跑");
}
}

final修饰类
当final修饰方法时需要注意:
1、final修饰的类不能被继承,没有子类;
2、final 类中的方法默认是 final 的,比如String类;
【代码示例】
public class Test extends Animal{
}
final class Animal {
public final void run(){
System.out.println("我会跑");
}
}

final、finally、finalize()三者的区别?
final
见上文
finally
finally 异常处理的一部分,它只能用在 try/catch 语句中,表示希望 finally 语句块中的代码最后一定被执行(存在一些情况导致 finally 语句块不会被执行,如 jvm 结束)
不被执行的情况:
- 直接返回未执行到 try-finally 语句块
- 抛出异常未执行到 try-finally 语句块
- 系统退出未执行到 finally 语句块
【代码示例】
public static String test() {
String str = null;
int i = 0;
if (i == 0) {
return str;//直接返回未执行到finally语句块
}
try {
System.out.println("try...");
return str;
} finally {
System.out.println("finally...");
}
}
public static String test2() {
String str = null;
int i = 0;
i = i / 0;//抛出异常未执行到finally语句块
try {
System.out.println("try...");
return str;
} finally {
System.out.println("finally...");
}
}
public static String test3() {
String str = null;
try {
System.out.println("try...");
System.exit(0);//系统退出未执行到finally语句块
return str;
} finally {
System.out.println("finally...");
}
}
finalize()
finalize() 是在 java.lang.Object 里定义的,Object 的 finalize() 方法什么都不做,对象被回收时 finalize() 方法会被调用。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作,在垃圾收集器删除对象之前被调用的。
一般情况下,此方法由JVM调用。特殊情况下,可重写 finalize() 方法,当对象被回收的时候释放一些资源,须调用 super.finalize() 。
面试官:小伙子来说一说Java中final关键字,以及它和finally、finalize()有什么区别?的更多相关文章
- Java中final关键字修饰变量、方法、类的含义是什么
Java中的关键字final修饰变量.方法.类分别表示什么含义? 先看一个简单的介绍 修饰对象 解释说明 备注 类 无子类,不可以被继承,更不可能被重写. final类中的方法默认是final的 方法 ...
- 面试官:兄弟,说说Java的static关键字吧
读者乙在上一篇我去系列文章里留言说,"我盲猜下一篇标题是,'我去,你竟然不知道 static 关键字'".我只能说乙猜对了一半,像我这么有才华的博主,怎么可能被读者猜中了心思呢,必 ...
- java中final 关键字的作用
final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...
- 关于Java中final关键字的详细介绍
Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...
- java中final关键字的使用方法
[java中为什么会有final变量]: final这个关键字的含义是"这是无法改变的"或者"终态的": 那么为什么要阻止改变呢? java语言的发明者可 ...
- 关于java中final关键字与线程安全性
在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步的作用.本质上讲,final能够做出如下保证:当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于" ...
- java 中final关键字
1.final变量,一旦该变量被设定,就不可以再改变该变量的值. final关键字定义的变量必须声明时赋值.一旦一个对象引用被修饰为final后,它只能恒定指向一个对象,一个既是static和fina ...
- Java中final关键字概述
使用final修饰过的变量都不可以改变: 1.final修饰变量 恒定不变的属性,可以用final关键字来修饰: 变量名建议全部使用大写 final修饰的变量不能改变,如果程序中重新赋值,编译报错 例 ...
- 解析Java中final关键字的各种用法
首先,我们可以从字面上理解一下final这个英文单词的中文含义:“最后的,最终的; 决定性的; 不可更改的:”.显然,final关键词如果用中文来解释,“不可更改的”更为合适.当你在编写程序,可能会遇 ...
- java中final关键字
一.final修饰方法 禁止任何继承类修改它的定义,保证在继承中使方法行为保持不闲并且不会被覆盖. final修饰的方法,同意编译器针对该方法的调用转为内嵌调用.(类似c++ 中的inline?) p ...
随机推荐
- Java使用HttpUtil.request方法可以发送请求即【Java访问url得到响应数据】
Java使用HttpUtil.request方法可以发送请求即[Java访问url得到响应数据] 注:这个工具类可以在网上找,也可以自己手写 ,手写的话需要用到以下依赖: <dependency ...
- vulnhub - tornado - wp
coverY: 0 tornado 信息收集 目标开放了80,22端口. 访问80网页,是默认页面: 目录枚举 用dirsearch没有什么发现,换gobuster发现了一个bluesky目录.访问如 ...
- Unity3d_Rewired官方文档翻译:概念(一):InputManager、Players、Actions
仅翻译了官方文档中的Essentials(要点).Concepts(概念)两部分,这是文档中最重要的部分,理解了这两部分的内容应该足以让你将Rewired运用到你的项目中,之后再去阅读文档的其他部分也 ...
- 17、Flutter StatelessWidget 、 StatefulWidget
在Flutter中自定义组件其实就是一个类,这个类需要继承StatelessWidget/StatefulWidget. StatelessWidget是无状态组件,状态不可变的widget Stat ...
- 逼疯UE设计师,不可不知的提升产品用户体验的10个测试方法
摘要:用户体验的描述比较主观,产品功能的可用性.可靠性.性能等都会影响用户的使用体验,比如功能bug问题也会说体验不好,程序崩溃也会说体验不好,性能卡顿会说体验不好,那是不是都在用户体验测试的范围呢? ...
- 华为云构建云原生DevSecOps平台,保障软件供应链全流程安全可信
摘要:面临网络安全挑战的大环境下,华为云构筑的云原生DevSecOps平台,打造了创新可控的安全服务,助力企业软件供应链全生命周期安全. 2022年8月13日,"2022中国DevOps社区 ...
- JS对象拷贝:深拷贝和浅拷贝
摘要:对象拷贝,简而言之就是将对象再复制一份,但是,复制的方法不同将会得到不同的结果. 本文分享自华为云社区<js对象深浅拷贝,来,试试看!>,作者: 北极光之夜.. 一.速识概念: 对象 ...
- 如何使用Tomcat实现WebSocket即时通讯服务服务端
摘要:HTTP协议是"请求-响应"模式,浏览器必须先发请求给服务器,服务器才会响应该请求.即服务器不会主动发送数据给浏览器. 本文分享自华为云社区<Tomcat支持WebSo ...
- 为了减少代码复杂度,我将if-else升级为面向状态编程
摘要:面向过程设计和面向对象设计的主要区别是:是否在业务逻辑层使用冗长的if else判断. 本文分享自华为云社区<从面向if-else编程升级为面向状态编程,减少代码复杂度>,作者:br ...
- 人人都会Kubernetes(一):告别手写K8s yaml,运维效率提升500%
1. Kubernetes的普及和重要性 随着云计算的迅速发展,容器化技术已成为构建和运行分布式应用程序的关键.而Kubernetes作为容器编排领域的佼佼者,已经成为了云原生应用的标准.它不仅简化了 ...