Java中final、finally和finalize的区别

Java中 final、finally、finalize 有什么区别? final、finally、finalize 是 Java 中三个不同的关键字,它们除了长得像之外,其他的(作用和含义)完全不同。它们三个的区别就好像:雷、雷锋、雷峰塔之间的区别。(是三个完全不同的东西)final、finally、finalize的区别如下:final:表示不可变性,用于修饰类、方法和变量 ,当用于类时,表示该类不能被继承;当用于方法时,表示该方法不能被子类重写(覆盖);当用于变量时,表示该变量的值不能被修改(成为常量)。 阅读详情

简介:

“final、finally和finalize有什么区别?”, 这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。final、finally和finalize虽然看起来很像,含义也差不多(字根都是final),但是它们的用法是不同的。本节主要来讨论一下它们在实际场景中的运用。

final用法说明:

是java关键字之一,用于修饰类或者方法,或者变量,可以和static共存。
被fianl修饰的这些类,方法,变量都不能再被修改。对于类,不能再被继承;对于方法,不能被重写;对于基本类型的变量,不能修改其值(其实就是常量);

对于引用类型(即final修饰的是一个对象的情形),就表示这个变量被赋予的引用是不可变的,注意,不可改变的只是这个变量所保存的引用,并不是这个引用所指向的对象。

一个类不能既被abstract声明,又被final声明,这是因为被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承,这和abstract正好是互斥的。

被final修饰的变量必须被初始化。初始化方式:
在定义的时候初始化。
final变量可以在初始化块中初始化,不可以在静态初始化块中初始化。
静态final变量可以在静态初始化块中初始化,不可以在初始化块中初始化。
final变量还可以在类的构造器中初始化,但是静态final变量不可以。

final用来修饰一个变量:

程序举例:

package demo.test.my;

public class BydCar {

    // 非静态final变量在定义时初始化
    public final String tagName = "BydCar";

    //非静态final变量可以在静态初始化块中初始化
    public final int tagId;
    // 在初始化块中初始化
    {
        tagId = 10000;
    }

    // 非静态final变量不能在静态初始化块中初始化
    // public final int C;
    // static {
    // C = 30;
    // }

    // 静态常量,在定义时初始化
    public static final float Min_Value = 0;

    public static final float Max_Value;
    // 静态常量,在静态初始化块中初始化
    static {
        Max_Value = 200.0f;
    }

    // 静态变量不能在初始化块中初始化
    // public static final int Max_Value;
    // {
    // Max_Value = 200.0f;
    // }

    //非静态final变量可以在构造器中初始化
    public final int code;

    // 静态final变量不可以在构造器中初始化
    // public static final int code;

    // 在构造器中初始化
    public BydCar() {
        code = 666666; //非静态final变量可以在构造器中初始化
        // 静态final变量不可以在构造器中初始化
        // code = 777777;

        // 给final的变量第二次赋值时,编译会报错
         //code = 888888;   //Variable 'G' might already have been assigned to
    }

    // final变量未被初始化,编译时就会报错
    //public final int I;   //编译错误:Variable 'I' might not have been initialized

    // 静态final变量未被初始化,编译时就会报错
    //public static final int STATIC_J;  //编译错误: Variable 'STATIC_J' might not have been initialized
}

运行上面的代码之后出了可以发现final变量(常量)和静态final变量(静态常量)未被初始化时,编译会报错;
另外还可以发现,静态final变量可以在构造器中初始化,却不可以在初始化块中初始化。 

final用来修饰一个方法:

程序举例:

BaseClass.java:

package demo.test.my;

public class BaseClass {
    //
    public final void fun() {
        System.out.println("[BaseClass] fun be call!");
    }
}

SubClass.java:继承自BaseClass

package demo.test.my;

public class SubClass extends BaseClass {
    /**
     * 子类无法重写(override)父类的final方法fun,否则编译时会报错:
     * 'fun()' cannot override 'fun()' in 'demo.test.my.BaseClass'; overridden method is final
     */
//     public void fun() {
//         System.out.println("[SubClass]子类--重写final方法");
//     }

    public static void main(String[] args) {
        SubClass sc = new SubClass();
        sc.fun(); //调用弗雷的fun
    }
}

运行结果:

[BaseClass] fun be call!
 

这里需要特殊说明的是,具有private访问权限的方法也可以增加final修饰,但是由于子类无法继承private方法,因此也无法重写它。

finally的用法:

finally是java的关键字,用在try-catch-finally,最终被执行的代码放在finally语句块中。

注意,return、continue和break都无法阻止finally语句块的执行。

finally的代码示例:

package demo.test.my;

public final class F0Car {
    public static void main(String[] args) {
        try {
            throw new NullPointerException();
        } catch (NullPointerException e) {
            System.out.println("程序抛出了异常");
            return;
        } finally {
            System.out.println("执行了finally语句块");
        }
    }
}

运行结果:

程序抛出了异常
执行了finally语句块

finalize的用法:

finalize不是java关键字,而是一个方法,属于java.lang.Object类的一个方法,它的定义如下:

protected void finalize() throws Throwable { }

finalize()方法是在GC清理它所从属的对象时被JVM自动调用的,如果执行它的过程中抛出了无法捕获的异常(uncaught exception),GC将终止对改对象的清理,并且该异常会被忽略;直到下一次GC开始清理这个对象时,它的finalize()会被再次调用。

finalize的代码示例:

package demo.test.my;

public final class F0Car {
    // 重写finalize()方法
    protected void finalize() throws Throwable {
        System.out.println("F0Car::finalize()"); //输出:F0Car::finalize()
    }

    public static void main(String[] args) {
        F0Car car = new F0Car();
        car = null;
        System.gc();
    }
}

运行结果:

F0Car::finalize()

 分析:

程序调用了java.lang.System类的gc()方法,引起GC的执行,GC在清理ft对象时调用了它的finalize()方法,因此才有了上面的输出结果。调用System.gc()等同于调用下面这行代码:

Runtime.getRuntime().gc();

调用它们的作用只是建议垃圾收集器(GC)启动,清理无用的对象释放内存空间,但是GC的启动并不是一定的,这由JAVA虚拟机来决定。


从“氛围编程“到“智能体工程“:AI编程范式的认知跃迁与工程实践 摘要: 2026年,ClaudeCode负责人鲍里斯·切尔尼提出用“智能体工程”(Agent Engineering)替代流行的“氛围编程”(Vibe Coding),认为后者过于主观,无法体现AI编程的系统化与工程化本质。智能体工程强调记忆系统、工具编排、任务分解、可观测性等核心技术,将AI编程从“玄学辅助”升级为可度量、可规模化的工程学科。本文通过对比术语差异、构建知识体系,并结合代码实例(如带记忆系统的代码生成Agent和可观测性系统),展示了智能体工程的实际应用。行业案例(如ClaudeCode的并 阅读详情

相关推荐

Linux下Catapro酶动力学预测工具保姆级安装指南(PyTorch+CUDA11.8适配版)

本文提供了Linux系统下Catapro酶动力学预测工具的详细安装指南,特别适配PyTorch+CUDA11.8环境。从环境准备、源码获取到虚拟环境创建、依赖包安装和模型配置,逐步指导用户完成安装流程,并包含常见问题排查和性能优化建议,帮助研究者快速部署这一高效酶动力学参数预测工具。

weixin_29278805的博客 213

Java基础【1】 final, finally, finalize 的区别

final:修饰--类,方法,变量。        类:不可被继承。        方法:不可被重写。        变量:初始化时给定值,以后不得修改。finally:是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到cat...

youxia007ya的技术社区 1243

评分卡建模学习(一)————数据预处理part.3

目录六、数据处理的思路及代码(一)对缺失值的处理:在我这个数据预处理的part.1板块(二)对异常值的处理:在我这个数据预处理的part.2板块(三)数据归一化、标准化:在我这个数据预处理的part.2板块(四)非结构化数据转变+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++———————————————————————————————————————————++++++++++++++++++++++++++

Morven_dai的博客 898

final,finally,finalize 的区别

final,finally,finalize 的区别 final 用于声明 属性(属性不可交变)、方法(方法不可覆盖)、类(类不可继承)。 finally 是 异常处理语句结构 的一部分,不管是否有异常,他的语句总是执行。 finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。

TheDevice的博客 6104

RS485接口EMC设计:三级防护与滤波隔离方案

RS485总线在工业现场面临共模噪声、差模脉冲和地电位差三大电磁兼容挑战。通过三级防护架构(气体放电管、PTC热敏电阻、半导体放电管)实现能量梯次泄放,结合共模扼流圈和滤波电容形成完整防护链。该方案经实测可将6kV浪涌下的通信稳定性提升90%,特别适用于工业自动化、电力监控等严苛环境。设计要点包括防护器件选型计算、PCB分区布局及地处理策略,其中GDT通流能力与TSS箝位电压的配合是关键。

weixin_33419305的博客 525

Advanced Installer打包避坑指南:如何正确配置64位系统下的Java环境与注册表条件(以15.7版本为例)

本文详细解析了使用Advanced Installer 15.7版本在64位系统下打包Java应用时的常见问题与解决方案。重点介绍了注册表重定向机制、Java环境检测的双保险策略、环境变量设置的隐藏坑以及权限管理的进阶技巧,帮助开发者避免安装包在用户机器上无法运行的幽灵问题。

weixin_28676289的博客 324

java基础: final、finally、finalize 有什么区别?

在java面试中,我们可能会被要求解释一些关键字、类、接口、方法的区别,本文归纳总结了final、finally、finalize的区别,便于复习。 ① final是一个关键字,可以修饰类、变量、方法,修饰类表示该类不能被继承,修饰方法表示该方 法不能被重写,修饰变量表示该变量是一个常量不能被重新赋值。 ② finally是一个关键字,一般出现在 try-catch代码块中,在处理异常的时候,通常我们将一定要执 行的代码放在 finally代码块中,表示不管是否出现异常,该...

weixin_48016395的博客 688

Facebook登录协议逆向实战:从加密参数到完整流程解析(附Python代码)

本文深入解析Facebook登录协议的逆向工程,重点拆解`lgndim`和`encpass`等加密参数的生成逻辑,并提供完整的Python实现代码。通过Base64解码和RSA加密技术,帮助开发者理解并实现Facebook登录流程,同时涵盖工程优化与安全实践。

weixin_30687051的博客 477

Java中“final、finally、finalize”三者的区别

Java中“final、finally、finalize”三者的区别 1. final 在java中,final关键字是修饰符,可以用来修饰类、方法和变量(成员变量或局部变量)。 (1)修饰类 当用final修饰一个类时,表明这个类不能被继承。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。 在使用final修饰类的时候...

wangkailili的博客 1032

如何实现SOLIDWORKS阵列的“智能变更”?

有时,我们在设计一个零件时,零件上有一排阵列孔,同时零件有不同的长度,我们又希望可以做到零件长度改变时,这排孔可以按长度等距增减孔阵列的个数;或是零件长度加长或缩短时,这排孔保持个数不变,按零件长度增减孔距。 那具体要怎么做呢?接下来,我们一起来看看怎么用SOLIDWORKS中简单的操作来实现这两种智能的变更: 零件长度加长或缩短时,这排孔要按长度等距增减孔阵列的个数。 零件长度加长或缩短时,这排孔保持个数不变,按零件长度增减孔距。 那接下来,我们一起来看看怎么用简单的操作来实现这两种智能的

SOLIDWORKS艾金米 2079

Himall商城ExpressDaDaHelper 取消订单(线上环境)

Himall商城ExpressDaDaHelper 取消订单(线上环境)

GZM888888的博客 399

【JAVA】final、finally、finalize 有什么区别?

在编写Java代码时,正确地使用final修饰符可以使代码更加稳定,finally关键字可以确保资源得到适当的清理,而finalize方法(虽然已被弃用)在一定情况下可以用于对象的清理操作。这三者相辅相成,为我们的代码提供了更高的可读性、可维护性和性能。在日常编程中,善用这三者,能够使我们的代码更加健壮且容易理解。希望通过对它们的深入理解,你能够在实际项目中更加灵活地运用这些关键字,写出更加优雅的Java代码。

AliceNo的博客 2550

2、集中式MIMO雷达研究进展:正交波形设计与信号处理

集中式多输入多输出(Multiple Input Multiple Output,MIMO)雷达通常利用正交波形增加发射波形 自由度,采用数字阵列拓展空间收发自由度,使得雷达接收机的天线孔径获得明显扩展,最终带来空间分辨率、 测角精确度、杂波抑制能力等大幅度提升。但是,这些性能提升的前提是发射波形具有正交特性。事实上,在 实际应用中,在不牺牲时域/频域资源情况下,受限于时宽带宽积,无法获得完全正交的波形集合,从而限制了 MIMO雷达系统性能。本文对集中式MIMO雷达正交波形复用的技术原理进行了系统回顾,分别

qq_43416206的博客 2772

Java中final、finally、finalize的区别与用法

1.简单区别: final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。 2.中等区别: 虽然这个单词在Java中都存在,但是并没太多关联: final:java中的关键字,修饰...

huaiyingdetective的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java中final、finally、finalize的区别

简单区别: final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。 中等区别: 虽然这三个单词在Java中都存在,但是并没有太多关联: final:jav...

aqs53198的博客 947

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java语言中final,finally,finalize的区别?

Java语言中final,finally,finalize的区别?

java1234的博客 592

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java面试必备:Java 中 final、finally 和 finalize 的区别详解

在 Java 编程中,`final`、`finally` 和 `finalize` 是三个看似相似但实际上完全不同的概念。初学者经常容易混淆它们。本文将详细解释这三者的区别,并通过代码示例和流程图帮助理解。

qq_58299462的博客 1051

JAVA中 final、finally、finalize 的区别

【代码】JAVA中 final、finally、finalize 的区别。

weixin_47132338的博客 595

Java三剑客:final、finally和finalize到底有什么区别?

try {// 释放资源🔑终极记忆口诀final是常量锁,变量方法类都能守;finally必执行,异常处理好帮手;finalize已过时,资源清理换新招。记住它们的特点,你的Java代码将更加健壮可靠!

全栈开发工程师 935

Java - 阐述final、finally、finalize的区别。

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net - final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初...

了解➔熟悉➔掌握➔精通 3万+

Java基础:final、finally、finalize的区别

一、背景。 这篇文章主要介绍了final、finally、finalize的区别详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。放假在家里休息,闲来无事,想巩固巩固自己的基础知识。Java基础这个我会一直更新的,希望大家关注 收藏 点赞。 二、final、finally、finalize。 1.总体区别。 final 是java中的关键字,表示这部分是“不可修改的”。使用final可以修饰:变量、方法、类。表示变量不可...

weixin_42188778的博客 3306

Java中final finally finalize有什么区别

代码: public class ExceptionTest13 { public static void main(String[] args) { final int i = 100; // i = 200; public static final double Math_PI = 3.1415926; /* finally也是一个关键字,跟try连用,用在异常处理机制当中 finally语句块中的

小白找大神啊的博客 346

详细说说Java中final、finally、finalize的区别

文章目录Java中final、finally、finalize的区别定义上的区别用法上的区别高级区别 Java中final、finally、finalize的区别 定义上的区别 final是java关键字,用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。 finally是java中异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方...

bruce_xia6116的博客 404
上一篇: Java中的基本类型和引用类型,在函数参数传递时采用值传递
下一篇: 怎样学好C语言-C语言学习路线与思维导图,经典书籍推荐
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值