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" ...
随机推荐
- CentOS 7 系统的安装
1.进入安装界面 2.选择"Install CentOS 7" 3.进入欢迎界面,默认语言为"English",点击"Continue" 进 ...
- ORA-00001: unique constraint (string.string) violated 违反唯一约束条件(.)
ORA-00001: unique constraint (string.string) violated ORA-00001: 违反唯一约束条件(.) Cause: An UPDATE or I ...
- Avoid mutating a prop directly since the value will be overwritten whenever the parent component re
子组件修改父组件的值踩坑 Vue1.0升级至2.0之后,直接在子组件修改父组件的值是会报错的 目的是为了阻止子组件影响父组件的数据. 我们都知道在vue中,父组件传入子组件的变量是存放在props属性 ...
- 这类注解都不知道,还好意思说会Spring Boot ?
前言 不知道大家在使用Spring Boot开发的日常中有没有用过@Conditionalxxx注解,比如@ConditionalOnMissingBean.相信看过Spring Boot源码的朋友一 ...
- pytest文档40-pytest.ini配置用例查找规则(面试题)
前言 面试题:pytest如何执行不是test开头的用例?如执行 xxx_*.py这种文件的用例. pytest.ini 配置文件可以修改用例的匹配规则. pytest命令行参数 cmd打开输入pyt ...
- Shell Scripting 笔记
Shell Scripting Tutorial Variables in the Bourne shell do not have to be declared, as they do in lan ...
- 【不知道怎么分类】NOIP2016 蚯蚓
题目大意 洛谷链接 给出\(n\)条蚯蚓,给出\(m\)秒,每一秒都把蚯蚓中最长的蚯蚓分成两段,一段是原来的\(p\)倍,剩下的就是\((1-p)\)倍.每一秒,除了刚刚产生的两条新蚯蚓,其余蚯蚓长度 ...
- BASH让标准输出和错误输出颜色不同
shell中运行的程序输出有标准输出(stdout)和错误输出(stderr)两种.当在终端中运行一个进程时,默认是stdout和stderr混在一起的,需要区分只能去读内容,人眼不容易快速区分. 如 ...
- go 继承
package main import "fmt" type Animal struct { Color string } // 继承动物结构体 type Dog struct { ...
- centos8上配置openresty/nginx可访问php
一,创建一个测试站的目录 [root@yjweb data]# mkdir dev [root@yjweb data]# cd dev [root@yjweb dev]# mkdir think_ww ...