Java -- "final" 的理解
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" 的理解的更多相关文章
- java的final变量理解
java的final变量理解 final基本类型是数值不能改变 final对象是引用不能改变,对象其自身是可以被修改的.
- Java 集合深入理解(7):ArrayList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...
- Java 集合深入理解(4):List<E> 接口
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...
- 谈谈你对 Java 平台的理解
声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...
- Java六大必须理解的问题
Java六大必须理解的问题 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Java玩玩就无所谓了.如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列.内容 ...
- Java基础之理解Annotation(与@有关,即是注释)
Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...
- Java 集合深入理解(8):AbstractSequentialList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...
- java线程安全理解
java线程安全理解 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. ...
- java常量池理解
String类两种不同的创建方式 String s1 = "zheng"; //第一种创建方式 String s2 = new String("junxiang" ...
随机推荐
- Varnish 不重启使之配置生效的方法
Varnish 在内存模式下比较高效,不过它有一个缺点就是 缓存是放在内存里的,一旦重启, 缓存文件也就没了. 往往由于需要调整 vcl 配置文件,但是又不想重启varnish服务,就让配置文件生效的 ...
- shell-的特殊变量-进程状态变量$$ $! $? $_详解
一:shell的特殊变量-进程状态变量详解 1. 进程状态变量 $$ 获取当前shell的进程号(pid) $! 执行上一个指令的pid,上一个后台运行进程的进程号 $? 获取执行上一个指令的返回值 ...
- 架构师根本不会被语言限制住,php照样可以用领域驱动设计DDD四层架构!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你在通往架构师的路上吗? 程序员这个行业就像是在不断的打怪升级,突破每一阶段的瓶颈期 ...
- JVM系列【6】GC与调优1
JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 GC基础知识 什么是垃圾 没有任何引用指向的一个对象或多个对象(循环引 ...
- 试用 Azure Sql 数据库
我们的12月试用账号的免费服务里有一个Azure Sql服务,最近正好自己做一个小工具需要一个数据库,正好可以把它当测试库顺便体验一把Azure Sql. 概述 Azure SQL 数据库 Azure ...
- 汕尾6397.7539(薇)xiaojie:汕尾哪里有xiaomei
汕尾哪里有小姐服务大保健[微信:6397.7539倩儿小妹[汕尾叫小姐服务√o服务微信:6397.7539倩儿小妹[汕尾叫小姐服务][十微信:6397.7539倩儿小妹][汕尾叫小姐包夜服务][十微信 ...
- MeteoInfoLab脚本示例:获取气团轨迹每个节点的气象数据
读取HYSPLIT输出的轨迹数据文件和相应时间的气象数据文件,生成轨迹图层,循环每条轨迹的节点,读出该节点的经度.纬度.气压.时间,通过对气象数据插值获得该节点的气象数据.脚本程序: #------- ...
- day47 Pyhton 数据库Mysql 04
# 表结构 # 建表 - 表的增加 # create table # 删表 - 表的删除 # drop table # 改表 - 表的修改 # alter table 表名 # rename 新表名 ...
- 基于SpringAop的鉴权功能
什么是 AOP 首先我们先了解一下什么是AOP,AOP(Aspect Orient Programming),直译过来就是面向切面编程.AOP是一种编程思想,是面向对象编程(OOP)的一种补充.面向对 ...
- elasticsearch-安装-centos7- es7.5 搭建
centos6 搭建 参考 https://www.cnblogs.com/php-linux/p/8758788.html 搭建linux虚拟机 https://www.cnblogs ...