您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java基础系列-final、finally关键字

时间:2021-12-15 11:54:45  来源:  作者:唯一浩哥

一、概述

final是JAVA关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。

有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。

finally关键字不同于final关键字,这是一个需要与异常体系结构配合使用的关键字,旨在定义必须要进行操作,一般用于在发生异常的时候进行一些收尾操作,比如释放资源等。

另外还有个finalized,它是一个方法,它需要与垃圾收集体系配合使用。主要在对象被垃圾收集之前进行一些操作,这些操作只会被执行一次,即使一个对象多次被标记为下次进行垃圾收集,也只有第一次会执行。

二、final作用

2.1 final修饰变量

变量被final修饰就会变成为常量,常量被保存在方法区中。

变量一旦被final修饰,必须手动进行初始化,未进行初始化的final常量是无法通过编译的。

如果只有final修饰的变量的初始化可以采用:

  • 定义时赋值
  • 代码块赋值
  • 构造器赋值

如果被static和final同时修饰的变量的初始化可以采用:

  • 定义时赋值
  • 静态代码块赋值

一旦final变量被static修饰,那么它就脱离了对象的组织(代码块、构造器都是对象的组织),升级为类的组织,所以需要在类级别的静态代码块中进行初始化。

public class FinalTest {
    final int i = 1;
    int j = 2;
    static int m = 3;
    static final int n = 4;
}

public class FinalTest {
    final int i;
    int j;
    static int m;
    static final int n;
    {
        i = 1;
    }
    static {
        n = 3;
    }
}

如果将上面的代码改成:

public class FinalTest {
    final int i;//2-
    int j;
    static int m;
    static final int n;//5-
}

上面代码第2行和第5行会报错,原因就是未进行初始化。

那么我们总结下final和static的现象,用于区分二者:

  • static修饰将内容脱离对象成为类成员。
  • final修饰将内容改造成必须被手动初始化的成员,一旦赋值,不再改变。

注意:同时被final和static修饰的变量成为静态常量,类常量,这种类常量在编译阶段会进行常量传播优化,将该类常量的值直接保存到调用类的常量池中,那么在程序执行到调用位置时,实际上与定义该类常量的类已经毫无关系,我(调用方)可以直接在我的常量池中获取到编译阶段优化过来的值,不再需要通过常量定义类的类型去调用其中定义的那个类常量了。

二者可以同时存在,各起各的作用。

2.2 final修饰方法

被final修饰的方法,可以被子类继承,但是不能被子类重写,也就是说这个方法在此以后其内部的实现就是固定不变的了,不能被改变。

2.3 final修饰类

被final修饰的类,被称之为最终类,其不再拥有子类,不可再进行扩展,最常见的final类就是String类。

String类被final修饰之后,其每个对象都是不变的,一旦定义就不再发生改变。

2.4 final修饰局部变量

final修饰的局部变量,该变量就不再是保存在栈空间中,而是保存在方法区中,不会随方法结束而失效,放大了局部变量的生命周期。

最常使用的地方就是局部内部类在访问方法的局部变量的情况下,这些局部变量就需要使用final修饰,因为当局部内部类访问局部变量时,会放大局部变量的作用域,局部变量一般在方法结束时就失效了,但是却有可能任然被内部类的对象持有使用。将该局部变量定义为final之后,它不再保存于栈空间,而是保存在方法区中,自然不会因为方法的结束而丢失。

public class FinalTest{
    public void outMethod(){
       final int s = 1;// 3-
        class innerClass{
            public void innerMethod(){
                System.out.println(s);
            }
        }
    }
}

如果去掉第3行的final,第5行就会报错。

2.5 final修饰方法参数

如果方法的参数被final修饰,那么这个参数的值在从方法调用时赋值开始就不能再改变,不能被重新赋值(不能改成他值)。

public class FinalTest{
    public void outMethod(final int s){
       s = 1;
    }
}

如上代码,方法参数s为final的,那么若去掉第2行的代码,为s重新赋值,则会报错。

三、finally作用

finally只有一种用法,那就是在try...catch..语句末尾使用。语法如下:

public class FinallyTest{
    public void test(){
        try{
          //someExecute
        }catch(Exception e){
          //someExecute
        }finally{
          //someExecute
        }
    }
}

finally块中的语句是一定会被执行的,无论是否会发生异常,重点:这里的异常指的是在try块中的部分,如果实在try块之前发生了异常,还没来得及执行try块语句,那么finally块中的内容也不会被执行,所以finally针对的是try块中的内容而设的。

如果在try块或catch块中存在return语句,那么,finally块中的内容必然会在return之前执行。

finally经常用于发生异常的情况下关闭打开的资源,比如io流,网络资源等。

四、finalized作用

finalized是Object类的protected方法。

当垃圾回收器发现一个对象不存在任何引用的时候,就会触发该方法的调用,调用由垃圾回收器发起。

子类重写该方法一般用于处理系统资源或者一些清理工作。

该方法并不被确保一定会调用,但是可以保证的是,一旦被调用,调用的线程并不会持有任何的同步锁,而且如果执行发生了异常,则忽略异常,同时停止执行。也就是说,finalized方法并不会对程序的正常流程、代码的正常运行造成意外的影响。

class FinalizedTest{
    @Override
    public void finalize(){
        // do something
    }
}

简述finalized执行流程:

当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。(摘自参考文章)

参考:



Tags:Java基础   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  Tags: Java基础  点击:(14)  评论:(0)  加入收藏
本期给大家带来的是JAVA基础中的JDBC,JDBC全称:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库,说白了就是用Java语言来操作数据库。在大数据开发基础中也是...【详细内容】
2021-03-16  Tags: Java基础  点击:(142)  评论:(0)  加入收藏
一、集合概述当我们在使用java进行编程开发时,经常会遇到一些需要集中存放的多个数据,这时我们可以选择“数组”或者“集合”,关于数组的知识可以参考上一篇文章,今天我们主要讲...【详细内容】
2020-08-14  Tags: Java基础  点击:(41)  评论:(0)  加入收藏
1. Session、Cookie是什么1.1 概念理解要了解session和cookie是什么,先要了解以下几个概念。1.1.1 无状态的HTTP协议协议:是指计算机通信网络中两台计算机之间进行通信所必须...【详细内容】
2019-09-26  Tags: Java基础  点击:(88)  评论:(0)  加入收藏
(1)数组:存储同一种数据类型的多个元素的容器(注意和集合的区别 后面的总结之中有)。 (2)特点:每一个元素都有编号,从0开始,最大编号是长度-1。编号的专业叫法:索引。 (3)定义格式...【详细内容】
2019-09-24  Tags: Java基础  点击:(85)  评论:(0)  加入收藏
RMI (Remote Method Invocation,远程方法调用)是Java一组拥护开发分布式应用程序的API,用于不同虚拟机间的通信,核心是远程对象RMI通信模型: 1、客户端调用辅助对象stub上方法2、...【详细内容】
2019-08-15  Tags: Java基础  点击:(235)  评论:(0)  加入收藏
主要内容IO 流字节流字符流异常处理Properties教学目标能够说出IO流的分类和功能能够使用字节输出流写出数据到文件能够使用字节输入流读取数据到程序能够理解读取数据read(...【详细内容】
2019-07-08  Tags: Java基础  点击:(296)  评论:(0)  加入收藏
▌简易百科推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(12)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(10)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(17)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  唯一浩哥    Tags:Java   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条