​ final,字面上是最终的意思,通常来说,我们用它来作为修饰符的时候,都是代表“这是无法改变的”的意思。不想改变可能出与两种理由:设计或效率。由于这两个原因相差甚远,所以我们在使用final关键字的时候很容易误用。

​ 主要从三个方面来讲

  1. final修饰变量
  2. final修饰方法
  3. final修饰类

final修饰变量

  • 修饰基本数据类型

    当我们使用final修饰基本数据类型时,代表我们申明了一个编译时的常量,编译器会在编译时就将其代入到表达式中进行计算,减少了一些我们在运行时的负担

  • 修饰引用数据类型

    当我们使用final修饰引用数据类型时,代表了这个引用不能再被指向其它对象,但是对象自身是可变的。对于初学者来说,这一点总是让人感觉到迷惑,举个例子:我们新建一个对象final Person p = new Person(),当我们申明后,p只能指向我们new的这个person对象,我们不能将p再指向一个新new出来的对象,但是对于p所指向的person对象来说,这个对象是可变的,假设这个person类中存在属性age并存在对应的getter,setter方法,我们还是可以调用p.setAge(xxx),来改变这个对象的属性

  • 一个既是static又是final的域只占据一段不能改变的存储空间。我相信理解了上面亮点,这一点也不难理解。static修饰的属性,随着类的加载而加载,final修饰的数据,“不可改变”。这就代表着当类加载完后,对象还未创建时,我们就已经申明了一段”不可改变“的存储空间

  • 空白final。我们看下面这段代码:

    public class Person{
    private int age;
    private final String name;
    public Person(String name){
    this.name = name;
    }
    }

    我们可以看到,在声明final类型的name属性时,我们并没有对其进行初始化,但是编译也通过了,这是为什么呢?其实就是因为我们在Person类唯一的构造函数中完成了对final修饰的属性的初始化。同时这也意味着,如果我们在声明的时候,采用了空白final的方式,那么在所有的构造函数中我们都要对这个属性进行初始化。这也不难理解,我们申明了一个非静态的空白final属性,非静态,代表我们声明这个属性是为了给这个类的对象使用,final代表了这个对象中有一个不可变的属性,且这个属性必须在对象创建的时候就完成初始化。这样分析下来,只能是在构造函数的时候对这个属性进行初始化,为了保证所有的对象都是正常的,那么所有构造函数都必须完成对这个属性初始化的任务。

final修饰方法

  • 我们在使用final修饰方法时,唯一目的就是将方法锁定,防止被子类复写,这是出与设计的目的。

  • private与final。

    首先来说,所有private的方法都会被隐式的指定为final,我们对一个private的方法采用final修饰符进行修饰是没有意义的。private的方法本身就无法被复写。这一点大家可以通过@Override注解去验证,我就不多解释了

final修饰类

我们在使用final修饰类时,代表了这个类不能被继承。由于final类禁止继承,所以final类中所有的方法都隐式指定为final的,因为无法覆盖它们。在final类中可以给方法添加final关键字,但这不会增添任何意义。

java基础篇 之 final关键字的更多相关文章

  1. JAVA基础学习之final关键字、遍历集合、日期类对象的使用、Math类对象的使用、Runtime类对象的使用、时间对象Date(两个日期相减)(5)

    1.final关键字和.net中的const关键字一样,是常量的修饰符,但是final还可以修饰类.方法.写法规范:常量所有字母都大写,多个单词中间用 "_"连接. 2.遍历集合A ...

  2. java基础学习之final关键字

    final可以修饰类.方法.变量,一旦使用了final则将不能改变被修饰的对象的引用; 被final修饰的类不可以被继承 被final修饰的方法不可以被覆盖 被final修饰的变量一般为常量,只允许对 ...

  3. java基础篇 之 super关键字的理解

    ​ 之前一直认为,super指向的是父类对象.到今天,仔细查询了资料,自己做了实验,确认这个结论是不对的.我们分一下几个点讨论下: super的作用: 第一种:用来访问父类被隐藏的成员变量 第二种:用 ...

  4. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

  5. java基础篇1

    JAVA基础篇1 注释 单行注释 //这是一个单行注释,由两个斜杠组成,不能嵌套多行注释 多行注释 /*这是一个 多行注释 ,//里面不能嵌套多行注释, 但是可以嵌套单行注释*/ 文档注释 /**ja ...

  6. Java基础篇(JVM)——类加载机制

    这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...

  7. Java基础篇(JVM)——字节码详解

    这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...

  8. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  9. java基础篇---I/O技术

    java基础篇---I/O技术   对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...

随机推荐

  1. (转) POJO和javabean的异同

    参考:http://blog.csdn.net/lushuaiyin/article/details/7436318 一:什么是POJOPOJO的名称有多种,pure old java object ...

  2. 怎么自定义DataGridViewColumn(日期列,C#)

    参考:https://msdn.microsoft.com/en-us/library/7tas5c80.aspx 未解决的问题:如果日期要设置为null,怎么办? DataGridView控件提供了 ...

  3. ios 中使用 animation-play-state: paused 属性失效的问题

    前言 因为要做一个播放器的播放图片旋转动画,像这样子 当音乐播放就转动,停止就暂停. 开始于是很自然地想到了使用Css3的 animation 动画属性CSS3 animation(动画) 属性 an ...

  4. Html5移动端弹幕动画实现示例代码

    已知20条内容要有弹幕效果,分成三层,速度随机. 先来看看效果: 所以这里不考虑填写生成的.只是一个展现的效果. 如果要看填写生成的,请不要浪费Time 思路 把单个内容编辑好,计算自身宽度,确定初始 ...

  5. three.js - 一个javascript 3D代码库

    这个项目的目的是用最简单的开发模式创建一个轻量级的3 d代码库,这个js库提供了canvas,svg,css3d和webgl这四种渲染方式. 下载地址: 下载地址:https://github.com ...

  6. 安装python3.8和python2.7

    在同一台电脑上同时安装Python2和Python3 目前Python的两个版本Python2和Python3同时存在,且这两个版本同时在更新与维护. 到底是选择Python2还是选择Python3, ...

  7. mysql中show status介绍一

    公司产品运用到mysql集群,集群遇到问题时,需要查看集群状态,使用到命令show status,今天趁机将show status中的各个变量的含义研究一下. 状态名 作用域 详细解释 Aborted ...

  8. E - Dungeon Master BFS

    [NWUACM] 你被困在一个三维的空间中,现在要寻找最短路径逃生!空间由立方体单位构成你每次向上下前后左右移动一个单位需要一分钟你不能对角线移动并且四周封闭是否存在逃出生天的可能性?如果存在,则需要 ...

  9. 国产操作系统深度deepin V20体验

    1. 安装系统 国产操作系统deepin V20 bata版本已经发布.本人第一时间安装和体验.在犹豫很久之后,因为受到最新内核,高版本的bash和Python的诱惑,字体更加和谐等因素,选择升级系统 ...

  10. 5. history

    https://developer.mozilla.org/zh-CN/docs/Web/API/History_API Browser History APIs