《Java架构筑基》从Java基础讲起——深入理解Finial

一.final关键字概述

1. 为什么会有final

由于继承中有一个方法重写的现象,而有时候我们不想让子类去重写父类的方法.这对这种情况java就给我们提供了一个关键字: final

2. final概述

final关键字是最终的意思,可以修饰类,变量,成员方法。

3. final修饰特点

  • 修饰类: 被修饰类不能被继承
  • 修饰方法: 被修饰的方法不能被重写
  • 修饰变量: 被修饰的变量不能被重新赋值,因为这个量其实是一个常量

4. final关键字修饰局部变量

  • 基本类型,是值不能被改变
  • 引用类型,是地址值不能被改变

二. final,finally,finalize有什么不同?

1. final可以修饰类,方法,变量

  • final修饰类代表类不可以继承拓展
  • final修饰变量表示变量不可以修改
  • final修饰方法表示方法不可以被重写

2. finally则是Java保证重点代码一定要被执行的一种机制

可以使用 try-finally 或者 try-catch-finally 来进行类似关闭 JDBC连接、保证 unlock 锁等动作。

3. finalize 是基础类 java.lang.Object的一个方法

它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在 JDK 9开始被标记为 deprecated。

4. final 关键字深入理解

  • 可以将方法或者类声明为 final,这样就可以明确告知别人,这些行为是不许修改的。
  • 如果你关注过 Java 核心类库的定义或源码, 有没有发现java.lang 包下面的很多类,相当一部分都被声明成为final class?在第三方类库的一些基础类中同样如此,这可以有效避免 API 使用者更改基础功能,某种程度上,这是保证平台安全的必要手段。
  • 使用 final 修饰参数或者变量,也可以清楚地避免意外赋值导致的编程错误,甚至,有人明确推荐将所有方法参数、本地变量、成员变量声明成 final。
  • final 变量产生了某种程度的不可变(immutable)的效果,所以,可以用于保护只读数据,尤其是在并发编程中,因为明确地不能再赋值 final 变量,有利于减少额外的同步开销,也可以省去一些防御性拷贝的必要。

5. 在以下4种特殊情况下,finally块不会被执行:

  • 在finally语句块中发生了异常。
  • 在前面的代码中用了System.exit()退出程序。
  • 程序所在的线程死亡。
  • 关闭CPU。

原文地址:https://blog.51cto.com/14637764/2459809

时间: 2024-10-10 10:48:57

《Java架构筑基》从Java基础讲起——深入理解Finial的相关文章

《Java架构筑基》从Java基础讲起——基本数据类型

1. 基本类型有哪些 Java定义了八种基本数据类型:byte,short,int,long,char,float,double,boolean. 基本数据类型也称为简单类型,这些类型可以分为四组: 整型.包括byte,short,int,long.用于表示有符号整数. 浮点型.包括float,double.用于表示带小数位的数字. 字符型.包括char.用于表示字符集中的符号. 布尔型.包括boolean.用于表示true/false值. 开发者可以直接使用这些类型,也可以使用它们来构造数组以

《Java架构筑基》从Java基础讲起——深入理解Static

1. static的作用和特点 可以用来修饰:成员变量,成员方法,代码块,内部类等.具体如下所示 修饰成员变量和成员方法 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用. 被static 声明的成员变量属于静态成员变量,静态变量存放在Java内存区域的方法区. 静态代码块 静态代码块定义在类中方法外,静态代码块在非静态代码块之前执行(静态代码块->非静态代码块->构造方法) 该类不管创建多少对象,静态代码块只执行一次. 静态内部类(

《Java架构筑基》从Java基础讲起——泛型基础

一.泛型的概述 1.1 泛型由来 我们的集合可以存储多种数据类型的元素,那么在存储的时候没有任何问题,但是在获取元素,并向下转型的时候,可能会存在一个错误,而这个错误就是ClassCastException . 很显然,集合的这种可以存储多种数据类型的元素的这个特点,不怎么友好 , 程序存在一些安全隐患,那么为了出来这种安全隐患,我们应该限定一个集合存储元素的数据类型,我们只让他存储统一中数据类型的元素,那么在做向下转型的是就不会存在这种安全隐患了. 怎么限定集合只能给我存储同一种数据类型的元素

《Java架构筑基》从Java基础讲起——泛型的使用

一. 泛型的使用 1. 泛型类的概述及使用 A:泛型类概述: 把泛型定义在类上 B:定义格式: public class 类名<泛型类型1,-> C:注意事项: 泛型类型必须是引用类型 2. 泛型方法的概述和使用 A:泛型方法概述: 把泛型定义在方法上 B:定义格式: public <泛型类型> 返回类型 方法名(泛型类型 变量名) public <T> void show(T t) { } 所谓泛型方法,就是在声明方法时定义一个或多个类型形参. 泛型方法的用法格式如下

《Java架构筑基》从Java基础讲起——String类深入理解

一. String问题答疑 String字符串是如何设计与实现考量的? String字符串缓存 intern()方法,由永久代移到堆中. String 的演化,Java 9 中底层把 char 数组换成了 byte 数组,占用更少的空间 二. String的创建机理 由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池.其运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对

《Java架构筑基》从Java基础讲起——关键字汇总

1. 常见的关键字 如果还有没有写上的,麻烦小伙伴告知一声-- 用于定义数据类型的关键字 class interface byte short int long float double char boolean void 用于定义数据类型值的关键字 true false null 用于定义流程控制的关键字 if else switch case default while do for break continue return 用于定义访问权限修饰符的关键字 private protecte

《Java架构筑基》从Java基础讲起——基础类型缓存池概念

以Integer为例 new Integer(123) 与 Integer.valueOf(123) 的区别在于: new Integer(123) 每次都会新建一个对象: Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用. Integer x = new Integer(123); Integer y = new Integer(123); System.out.println(x == y); // false Integer z = Integ

《Java架构筑基》从Java基础讲起——Int和Integer深入分析

1.关于int和Integer的问题区别分析 编译阶段.运行时,自动装箱 / 自动拆箱是发生在什么阶段? 使用静态工厂方法 valueOf 会使用到缓存机制,那么自动装箱的时候,缓存机制起作用吗? 为什么我们需要原始数据类型,Java 的对象似乎也很高效,应用中具体会产生哪些差异? 阅读过 Integer 源码吗?分析下类或某些方法的设计要点? int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而i

《Java架构筑基》从Java基础讲起——常见的API方法

1. Object类 1.1 Object有哪些公用方法? a.方法equals测试的是两个对象是否相等 b.方法clone进行对象拷贝[问题:是浅拷贝还是深拷贝?] c.方法getClass返回和当前对象相关的Class对象 d.方法notify,notifyall,wait都是用来对给定对象进行线程同步的 2. String类 2.1 String类的一些特性 String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它