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. CentOS 7 系统的安装

    1.进入安装界面 2.选择"Install CentOS 7" 3.进入欢迎界面,默认语言为"English",点击"Continue" 进 ...

  2. ORA-00001: unique constraint (string.string) violated 违反唯一约束条件(.)

    ORA-00001: unique constraint (string.string) violated   ORA-00001: 违反唯一约束条件(.) Cause: An UPDATE or I ...

  3. Avoid mutating a prop directly since the value will be overwritten whenever the parent component re

    子组件修改父组件的值踩坑 Vue1.0升级至2.0之后,直接在子组件修改父组件的值是会报错的 目的是为了阻止子组件影响父组件的数据. 我们都知道在vue中,父组件传入子组件的变量是存放在props属性 ...

  4. 这类注解都不知道,还好意思说会Spring Boot ?

    前言 不知道大家在使用Spring Boot开发的日常中有没有用过@Conditionalxxx注解,比如@ConditionalOnMissingBean.相信看过Spring Boot源码的朋友一 ...

  5. pytest文档40-pytest.ini配置用例查找规则(面试题)

    前言 面试题:pytest如何执行不是test开头的用例?如执行 xxx_*.py这种文件的用例. pytest.ini 配置文件可以修改用例的匹配规则. pytest命令行参数 cmd打开输入pyt ...

  6. Shell Scripting 笔记

    Shell Scripting Tutorial Variables in the Bourne shell do not have to be declared, as they do in lan ...

  7. 【不知道怎么分类】NOIP2016 蚯蚓

    题目大意 洛谷链接 给出\(n\)条蚯蚓,给出\(m\)秒,每一秒都把蚯蚓中最长的蚯蚓分成两段,一段是原来的\(p\)倍,剩下的就是\((1-p)\)倍.每一秒,除了刚刚产生的两条新蚯蚓,其余蚯蚓长度 ...

  8. BASH让标准输出和错误输出颜色不同

    shell中运行的程序输出有标准输出(stdout)和错误输出(stderr)两种.当在终端中运行一个进程时,默认是stdout和stderr混在一起的,需要区分只能去读内容,人眼不容易快速区分. 如 ...

  9. go 继承

    package main import "fmt" type Animal struct { Color string } // 继承动物结构体 type Dog struct { ...

  10. centos8上配置openresty/nginx可访问php

    一,创建一个测试站的目录 [root@yjweb data]# mkdir dev [root@yjweb data]# cd dev [root@yjweb dev]# mkdir think_ww ...