Java具有继承和多态的特性,这也造就了Java语言的面向对象的灵活性。但是,过于灵活就意味的有失控的可能性。

于是,产生了final 的概念 -- 为了数据的绝对安全,无法被后期修改,英文称之为 make it unmutable.

1. final 与 类

当不存在final的时候,若 B类 继承 A类,A类 可重写(overide) B类 中所有的方法,所以此时的 A类,是不安全的!A类中的内部逻辑是可被修改。在需要类安全的时候,就需要一种机制,对继承加以限制,这也就自然而然的产生的了 final的概念。这也是为什么一旦被final修饰的类无法被继承。若final修饰的类可以被继承,final存在的意义何在?

2.final 与 变量

与class类似,对于变量的安全性也需要final的概念来实现。变量安全性要从几个角度与反问我们自己:final修饰的变量能否被继承?继承后是否影响其unmutable的特性?若不能被继承,则可保证其unmutable的特性,但是继承的话,变量也可以用机制来实现unmuatable的特性。但是该变量的初始化的权利绝对不能下放到子类当中,若每一个子类都可以随意初始化final修饰过的变量,使得final变量可以有多种值的可能,必然违背的数据安全对变量要求 -- 即有权访问无权修改。既然子类有权访问,所以要保证数据的存在性,在子类对象创立之前,该数据也确保存在。这也就是为什么final变量一旦被声明必须初始化,且可以继承。(虽然可以一刀切:令其不可继承,但是继承在安全的基础上,增加的编写程序的灵活性,何乐而不为?)

3. final 与 方法

通样的,为了保护方法的安全性(make it unmutable),此时安全指的无论在何种条件下,若输入相同的要求输入值,一定返回相同要求的返回值,但是这种情况可能会由于继承后的重写遭到破坏,所以final修饰后的方法,必然不能被重写。同时,可继承的特性也使得编写的代码具有更高的灵活性。

总结

final class:不可被继承

final variable: 可以被继承(灵活性),但是声明必须被初始化(安全性)。

final method: 可以被继承(灵活性),可以重载(灵活性),不可被重写(安全性)。

Java -- "final" 的理解的更多相关文章

  1. java的final变量理解

    java的final变量理解 final基本类型是数值不能改变 final对象是引用不能改变,对象其自身是可以被修改的.

  2. Java 集合深入理解(7):ArrayList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...

  3. Java 集合深入理解(4):List<E> 接口

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...

  4. 谈谈你对 Java 平台的理解

    声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...

  5. Java六大必须理解的问题

    Java六大必须理解的问题 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Java玩玩就无所谓了.如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列.内容 ...

  6. Java基础之理解Annotation(与@有关,即是注释)

    Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...

  7. Java 集合深入理解(8):AbstractSequentialList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...

  8. java线程安全理解

    java线程安全理解 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. ...

  9. java常量池理解

    String类两种不同的创建方式 String s1 = "zheng"; //第一种创建方式 String s2 = new String("junxiang" ...

随机推荐

  1. [POI2010]PIL-Pilots 单调队列

    [POI2010]PIL-Pilots 题意: 给定一个序列和一个数值k,求一段连续最大区间是的最大值与最小值之差小于k: 思路: 因为要维护最大值和最小值并且连续,使用两个单调队列分别同时维护最大最 ...

  2. 洛谷P1450 [HAOI2008]硬币购物 背包+容斥

    无限背包+容斥? 观察数据范围,可重背包无法通过,假设没有数量限制,利用用无限背包 进行预处理,因为实际硬币数有限,考虑减掉多加的部分 如何减?利用容斥原理,减掉不符合第一枚硬币数的,第二枚,依次类推 ...

  3. JVM系列【4】内存模型

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 硬件层数据一致性 - 存储器层次结构 从L6-L0 空间由大变小,速度由慢 ...

  4. Spring系列 SpringMVC的请求与数据响应

    Spring系列 SpringMVC的请求与数据响应 SpringMVC的数据响应 数据响应的方式 y以下案例均部署在Tomcat上,使用浏览器来访问一个简单的success.jsp页面来实现 Suc ...

  5. CentOS 7系统常见快捷键操作方式

    快捷键操作方式 Linux系统中一些常见的快捷方式,可有效提高操作效率,在某些时刻也能避免操作失误带来的问题. 最有用的快捷键 序号 快捷键 官方说明 掌握程度 01 Tab 命令或路径等的补全键 移 ...

  6. 【线段树分治】Dash Speed

    代码的美妙 #include <bits/stdc++.h> %:pragma GCC optimize(3) using namespace std; const int maxn=7e ...

  7. cmd/powershell常用命令 git常用命令

    cmd/powershell: 1. 新建文件夹: mkdir directoryName 2. 新建文件: cmd: type nul>fileName (空文件) powershell: n ...

  8. App在后台运行时如何保存数据到sqlite数据库

    iOS程序进入后台后,是不允许读写任何文件和数据库(sqlite),但是允许读写NSUserDefault中的数据. 因此在后台时如果想存储数据,则可使用NSUserDefault(偏好设置)临时保存 ...

  9. .Net Core 3.1.2 区域路由配置【原创】

    昨天遇到一个项目问题,新建的.NET core矿建在新建区域的MVC页面里面,无法通过路由找到页面.然后在网络上查询很多资料,发现都是千古文章一大抄,而且都是错误的. 后面又添加了3个专业技术群,同样 ...

  10. Spark如何删除无效rdd checkpoint

    spark可以使用checkpoint来作为检查点,将rdd的数据写入hdfs文件,也可以利用本地缓存子系统. 当我们使用checkpoint将rdd保存到hdfs文件时,如果任务的临时文件长时间不删 ...