写在开头

面试官:“小伙子,用过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()有什么区别?的更多相关文章

  1. Java中final关键字修饰变量、方法、类的含义是什么

    Java中的关键字final修饰变量.方法.类分别表示什么含义? 先看一个简单的介绍 修饰对象 解释说明 备注 类 无子类,不可以被继承,更不可能被重写. final类中的方法默认是final的 方法 ...

  2. 面试官:兄弟,说说Java的static关键字吧

    读者乙在上一篇我去系列文章里留言说,"我盲猜下一篇标题是,'我去,你竟然不知道 static 关键字'".我只能说乙猜对了一半,像我这么有才华的博主,怎么可能被读者猜中了心思呢,必 ...

  3. java中final 关键字的作用

    final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...

  4. 关于Java中final关键字的详细介绍

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

  5. java中final关键字的使用方法

     [java中为什么会有final变量]: final这个关键字的含义是"这是无法改变的"或者"终态的": 那么为什么要阻止改变呢? java语言的发明者可 ...

  6. 关于java中final关键字与线程安全性

    在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步的作用.本质上讲,final能够做出如下保证:当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于" ...

  7. java 中final关键字

    1.final变量,一旦该变量被设定,就不可以再改变该变量的值. final关键字定义的变量必须声明时赋值.一旦一个对象引用被修饰为final后,它只能恒定指向一个对象,一个既是static和fina ...

  8. Java中final关键字概述

    使用final修饰过的变量都不可以改变: 1.final修饰变量 恒定不变的属性,可以用final关键字来修饰: 变量名建议全部使用大写 final修饰的变量不能改变,如果程序中重新赋值,编译报错 例 ...

  9. 解析Java中final关键字的各种用法

    首先,我们可以从字面上理解一下final这个英文单词的中文含义:“最后的,最终的; 决定性的; 不可更改的:”.显然,final关键词如果用中文来解释,“不可更改的”更为合适.当你在编写程序,可能会遇 ...

  10. java中final关键字

    一.final修饰方法 禁止任何继承类修改它的定义,保证在继承中使方法行为保持不闲并且不会被覆盖. final修饰的方法,同意编译器针对该方法的调用转为内嵌调用.(类似c++ 中的inline?) p ...

随机推荐

  1. 1.elasticsearch运行

    在docker中运行elasticsearch.kibana 一.MacOs 首先需要安装doceker,提供两种方式,选一种方便的就好 1.命令行安装方式 安装命令行 xcode-select -- ...

  2. 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 10.5.作业五 为游戏添加一个积分系统,随机生成增益道具

    斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章将解决作业五提出的问题,使用PlayerState,在原本游戏的基础上引入积分系统,实现击杀敌人得分,拾 ...

  3. js文字转语音播放SpeechSynthesisUtterance

    文字转语音 SpeechSynthesisUtterance是HTML5中新增的API,用于将指定文字合成为对应的语音 function sayTTS(content) { const synth = ...

  4. 百万奖池角逐,华为云IoT边缘带你看懂“边缘计算开发者大赛”

    摘要:2022年9月1日,第二届边缘计算开发者大赛正式启动. 2022年9月1日,第二届边缘计算开发者大赛正式启动! 本届大赛由华为云参与承办,中国信息通信研究院.工业互联网产业联盟.边缘计算产业联盟 ...

  5. 自己搭建git服务器:linux自己Gitlab服务

    github只能保存开源项目,私有项目要收费. 公司的git不想上传个人项目,比如我的博客:  https://www.zhoulujun.cn/.https://www.zhoulujun.co h ...

  6. hadoop fs,hadoop dfs以及hdfs dfs区别

    1.hadoop dfs 专门针对hdfs系统 2.hdfs dfs 和hadoop dfs,当使用hadoop dfs时会被转为hdfs dfs命令 3.hadoop fs 范围更广

  7. 总结vue3 的一些知识点:MySQL NULL 值处理

    MySQL NULL 值处理 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. ...

  8. 抖音"凶猛"的幕后英雄,火山引擎 DataTester 累计做过 150 万次 A/B 测试

    在国内互联网领域,字节跳动是最为推崇 A/B 测试的公司,旗下"抖音"."今日头条"两大最著名产品,连 APP 的名字都是来源于 A/B 测试. A/B 测试( ...

  9. 【已解决】无法打开.xlsx文件,xlrd.biffh.XLRDError: Excel xlsx file; not supported

    原因是最近xlrd更新到了2.0.1版本,只支持.xls文件.所以x1 = xlrd.open_workbook("data.xlsx")会报错. 可以安装旧版xlrd,在cmd中 ...

  10. django实现微信公众号扫码登录

    首先是去获取access_token,access_token接口有次数限制,所以保存到缓存,失效时再去调用接口 import base64 import json import time impor ...