02-final、finally、finalize的区别?

news2024/11/20 19:24:50

1.final

final是java中的修饰符,用于修饰属性(变量)、方法、类。

1.被final修饰的变量不可以被改变,如果修饰引用,那么表示引用不可变,引用指向的内容可变. 被修饰的常量,在编译阶段会存入常量池中.

2.被final修饰的方法不可以被重写, 被修饰的方法,JVM会尝试将其内联,以提高运行效率

3.被final修饰的类不可以被继承

public class Solution {
    //1.修饰类变量:
    //如果final修饰的是类变量,只能在静态初始化块中指定初始值或者声明该类变量时指定初始值。
    final static int a = 1;//在声明的时候赋值

    final static int b;
    static {//或者静态代码块赋值
        b=2;
    }

    //2.修饰成员变量:
    //如果final修饰的是成员变量,可以在⾮静态初始化块、声明该变量或者构造器中执⾏初始值。
    final int num1=1;//声明时赋值

    final int num2;
    {//⾮静态初始化块中赋值
        num2=1;
    }

    final int num3;
    //构造方法中赋值
    Solution(){
        num3=5;
    }


    public static void main(String[] args){
    //3.修饰局部变量
        //局部变量必须由程序员显示初始化。因此使⽤final修饰局部变量时,
        // 可以在定义时指定默认值(后⾯的代码不能对变量再赋值),
        final int x=10;
        // 也可以不指定默认值,⽽在后⾯的代码中对final变量赋初值(仅⼀次)
        final int y;
        y=15;//只能被赋值零次或一次, 所以不写该行代码也不会报错
    }
}
//如果final修饰的是引⽤类型的变量,则在对其初始化之后便不能再让其指向另⼀个对象。
//但是引⽤的值是可变的。
public class FinalReferenceTest{
	public static void main(){
		final int[] iArr={1,2,3,4};
		iArr[2]=-3;//合法
		iArr=null;//⾮法,对iArr不能重新赋值
		final Person p = new Person(25);
		p.setAge(24);//合法
		p=null;//⾮法
	}
}

2.finally

finally是在异常处理中的使用的,搭配try, catch使用

try {
	//异常捕获
} catch (Exception e) {
	//处理异常
}finally{
	//必须执行的代码,如close方法等
}
1.如果 try 语句块正常,那么在 try 语句块中的语句都执行完之后,再执行 finally 语句块.
2.不管 try 语句块正常结束还是异常结束,finally 语句块都是会执行的.
3.当try和catch中有return时,finally仍然会执行;
4.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,无论finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定好的;
5.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值.

1.如果 try 语句块正常,那么在 try 语句块中的语句都执行完之后,再执行 finally 语句块.

public static void main(String[] args){
        try {
            //异常捕获
            System.out.println("start");
            System.out.println("step1");
        } catch (Exception e) {
            //处理异常
            System.out.println("异常信息:"+e);
        }finally{
            //必定执行的代码
            System.out.println("ok");
        }
    }

在这里插入图片描述

2.不管 try 语句块正常结束还是异常结束,finally 语句块都是会执行的.

    public static void main(String[] args){
        try {
            //异常捕获
            System.out.println("start");
            int a=10/0;
            System.out.println("step1");
        } catch (Exception e) {
            //处理异常
            System.out.println("异常信息:"+e);
        }finally{
            //必定执行的代码
            System.out.println("ok");
        }
    }

在这里插入图片描述

3.当try和catch中有return时,finally仍然会执行;

4.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,无论finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定好的;

5.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值.

    public static int fun(){
        int a=10;
        try {
            //异常捕获
            return a;
        } catch (Exception e) {
            //处理异常
            System.out.println("异常信息:"+e);
        }finally{
            //必定执行的代码
            a=6;
            System.out.println("ok");
        }
        return 0;
    }

    public static void main(String[] args){
        int a=fun();
        System.out.println(a);
    }

3.finalize

finalize() 是Java中Object的一个protected方法.返回值为空,当该对象被垃圾回收器回收时,会调用该方法.

关于finalize()函数

1.finalize不等价于c++中的析构函数;
2.对象可能不被垃圾机回收器回收;
3.垃圾回收不等于析构;
4.垃圾回收只与内存有关;
5.垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的;
6.程序强制终结后,那些失去引用的对象将会被垃圾回收.(System.gc())

finalize()的用途:比如当一个对象代表了打开了一个文件,在对象被回收前,程序应该要关闭该文件,可以通过finalize函数来发现未关闭文件的对象,并对其进行处理.

public class FileOperator {

    private boolean closed = false;

    void close(){
        this.closed = true;
    }

    @Override
    protected void finalize(){//当垃圾回收器企图回收本对象时,会调用该方法,该方法是重写父类的方法的
        if(!closed){//如果文件没有被关闭,
            System.out.println("Error: A File was not closed . Name:" + this);
            this.closed = true;
        }
    }

    public static void main(String[] args) {
        FileOperator fileOperator = new FileOperator();//有引用的对象,不会被虚拟机回收
        new FileOperator();//匿名对象,会被虚拟机回收
        System.gc();//强制进行终结动作
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片播放器的实现1——利用Image2LCD提取图片数据并显示

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考内容 (1)https://xiefor100.blog.csdn.net/article/details/71941527 (2)https://xiefor100.blog.csdn.net/article/details/78529519 内容总结 …

2022. 12 青少年软件编程(图形化) 等级考试试卷(四级)

2022年12月 青少年软件编程(图形化) scratch等级考试试卷(四级) 分数: 100 题数: 28 一、单选题(共 15题,共 30分) 1.运行下列程序, 变量“结果”的值为? ( &…

WXSS 如何进行编译?

过往中小企业或技术团队开发一个 App 的时间成本和人力成本居高难下,但是随着微信上线小程序,更像是为这部分群体打开了一扇天窗,此后小程序呈现出井喷式发展的状态,不仅微信,支付宝、百度、抖音等超级 App 都跟上步伐…

【C++核心编程】C++全栈体系(十)

C核心编程 第四章 类和对象 六、继承 继承是面向对象三大特性之一 有些类与类之间存在特殊的关系,例如下图中: 我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。 这个时候我们就可以考…

华为DHCPv6实验配置

目录 配置AR1作为DHCPv6服务器为PC1分配IPv6地址 配置AR2作为DHCPv6服务器,AR1作为DHCPv6中继器为PC2分配IPv6地址 配置AR3作为DHCPv6 PD服务器为AR1分配地址前缀 什么是DHCP PD 配置AR1作为DHCPv6服务器为PC1分配IPv6地址 AR1 DHCPv6服务器端配置 ipv6 …

解决N+1问题的另一种方法 - 关联的多结果集ResultSet

如果我的博客对你有帮助,欢迎进行评论✏️✏️、点赞👍👍、收藏⭐️⭐️,满足一下我的虚荣心💖🙏🙏🙏 。 从版本 3.2.3 开始,MyBatis 提供了另一种解决 N1 查询问题的方…

C语言——位段

文章目录思维导图:一. 什么是位段二.位段的内存分配三.位段的跨平台问题四.位段的应用结语:思维导图: 一. 什么是位段 位段的声明和结构体类似,但是有2个不同: 位段的成员必须是int、unsigned int 或 signed int(在很多平台上cha…

python自学之《21天学通Python》(9)——基于tkinter的GUI编程

第12章 基于tkinter的GUI编程 Windows的图形用户界面非常方便用户操作,因此,Windows操作系统得到了广大个人计算机用户的欢迎。在Python中,也可以编写美观的GUI界面应用程序与项目。tkinter是Python自带的用于GUI编程的模块,tkin…

【论文速递】CVPR2022 - 学习 什么不能分割:小样本分割的新视角

【论文速递】CVPR2022 - 学习 什么不能分割:小样本分割的新视角 【论文原文】:Learning What Not to Segment: A New Perspective on Few-Shot Segmentation 获取地址:https://openaccess.thecvf.com/content/CVPR2022/papers/Lang_Learning_What_Not_…

Linux--线程控制--线程相关函数--tid--0109 10

1.如何理解线程 定义:在一个程序里的一个执行路线就叫做线程(thread)。 更准确的定义是:线程是“一个进程内部的控制序列”。 每个进程都有自己的进程地址空间和task_struct结构体,如果我们通过一定的方式在创建进程…

【记录】ChatGPT|近期两次更新一览(更新至2023年1月12日)

如果你还没有使用过ChatGPT,可以先看看我的上一篇文章:【记录】ChatGPT|注册流程、使用技巧与应用推荐(更新至2022年12月14日)。   昨天晚上,ChatGPT突然很多人都无法登录,包括我。我当时以为…

SpringBoot+Redis+@Cacheable实现缓存功能

SpringBootRedisCacheable实现缓存功能一、pom文件加入Redis与cache的依赖和yml配置二、EnableCaching允许使用注解进行缓存三、Redis配置四、业务逻辑1.UserController2.UserService3.UserServiceImpl4.AdminServiceImpl5.Cacheable和CachePut区别五、测试1.执行saveUser方法2…

剑指offer----C语言版----第十七天----面试题23:链表中环的入口节点

目录 1. 链表中环的入口节点 1.1 环形链表Ⅰ 1.1.1 题目描述 1.1.2解题思路 1.1.3 扩展问题 1.2 环形链表Ⅱ 1.2.1 题目描述 1.2.2 思路分析 1. 链表中环的入口节点 在leetcode上的剑指offer专栏没有收录这道题目,但Leetcode上是有这道题目的,环…

U3D客户端框架之 音效管理器 与 Fmod介绍安装导入Unity

一、Fmod介绍与安装导入Unity 1.Fmod与Unity内置Audio播放器对比 Unity内置的Audio底层使用的是FMOD,但是功能不够齐全,高级一点的功能如混合(Mix)等无法使用; 音效管理应该和Unity工程解耦合,这样子可以减轻音效设计师的负担&a…

ArcGIS基础实验操作100例--实验86矢量面重叠分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 空间分析篇--实验86 矢量面重叠分析 目录 一、实验背景 二、实验数据 三、实验步骤 (1&am…

初阶指针详解✍

目录1.内存和地址2.指针变量的大小3.指针类型的意义意义1:指针访问权限的大小意义2:指针类型决定指针的步长4.野指针野指针成因如何规避野指针5.指针的运算指针加减整数指针减指针指针的比较运算6.指针与数组的关系7.二级指针1.内存和地址 内存是电脑上特…

2、C语言程序规范

目录 1. 代码缩进 2. 变量、常量命名规范 3. 函数的命名规范 4. #include指令 5. 注释 6. main函数 7.函数返回值 8. 变量赋初值 俗话说&#xff0c;“没有规矩&#xff0c;不成方圆。” 如&#xff1a;第一个程序 #include <stdio.h>void main(){printf("…

基于java Springmvc+mybatis 电影院售票管理系统设计和实现以及文档

基于java Springmvcmybatis 电影院售票管理系统设计和实现以及文档 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留…

vue报错汇总

项目场景&#xff1a; 使用vue报错汇总。 1、项目启动不报错也不成功 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 项目启动时&#xff0c;一直启动不成功&#xff0c;末句提示 98% emitting Copyplugin… 原因分析&#xff1a; 最有可能是因为require或者import了…

系统设计技巧:使用Postgres作为发布/订阅和作业服务器

如果在项目中需要发布/订阅和作业服务器&#xff0c;可以尝试使用 Postgres。它将为您提供大量数据完整性和性能保证&#xff0c;并且不需要您或您的团队学习任何新技术。如果你正在做任何足够复杂的项目&#xff0c;你将需要一个 发布/订阅[1] 服务器来处理事件。本文将向你介…