Java关键字final使用详解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

http://docs.oracle.com/javase/tutorial/java/IandI/final.html
Writing Final Classes and Methods
You can declare some or all of a class's methods final. You use the final keyword in a method declaration to indicate that the method cannot be overridden by subclasses. The Object class does this—a number of its methods are final.

You might wish to make a method final if it has an implementation that should not be changed and it is critical to the consistent state of the object. For example, you might want to make the getFirstPlayer method in this ChessAlgorithm class final:

class ChessAlgorithm {
    enum ChessPlayer { WHITE, BLACK }
    ...
    final ChessPlayer getFirstPlayer() {
        return ChessPlayer.WHITE;
    }
    ...
}

Methods called from constructors should generally be declared final. If a constructor calls a non-final method, a subclass may redefine that method with surprising or undesirable results.

Note that you can also declare an entire class final. A class that is declared final cannot be subclassed. This is particularly useful, for example, when creating an immutable class like the String class.

从构造函数中调用的方法最好声明为final。如果构造调用了非final的方法,子类如果重新定义了那个方法,会带来意想不到的结果。
请注意你可以声明整个类是final的。被声明为final的类不会有子类。


参考博客:

http://blog.csdn.net/andie_guo/article/details/12885885


根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

  • final类不能被继承,没有子类,final类中的方法默认是final的。

  • final方法不能被子类的方法覆盖,但可以被继承。

  • final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

  • final不能用于修饰构造方法。

注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

1、final数据:

  • 一个永不改变的编译时常量。

  • 一个在运行时被初始化的值,而之后无法被改变;

  • 一个既是static又是final的域:是一段不能改变的存储空间;

final类型运用于数据:

  • 基本数据类型(int、double、char...)运用final时,使数值恒定不变;

  • 对象引用运用final时,final使得引用恒定不变,引用内部的数据若不是final型,可以进行修改。

  • 数组类型运用final时,final使得数组引用恒定不变,数组内部的数据若不是final型,可以进行修改。

final与static

  • final指明数据为一个常量,恒定无法修改;

  • static指明数据只占用一份存储区域;

public final class  FinalData {  private final int valueOne = 3;  private int valueTwo = 4;  private final int[] a = {1,2,3,4,5,6,7,8,9};  private int[] b = {1,2,3,4,5,6,7,8,9};  private static final int VAL_TWO = 3;  public static void main(String[] args) {  FinalData finalData = new FinalData(); /*-----------基本类型测试------------------------------------*/  
//       finalData.valueOne = 4;//valueOne是常量,无法修改  finalData.valueTwo = 14;//valueTwo不是常量,可以修改  /*-----------对象类型测试------------------------------------*/  
//      finalData.v1 = new Value(5);//v1对象是final型常量,其引用是无法修改的。  /*-----------数组类型测试------------------------------------*/  
//      finalData.a = new int[3];//数组a是final型,无法修改a的引用  finalData.b = new int[13];//数组b不是final型,可以对其引用进行修改  for(int i=0;i<finalData.a.length;i++)   finalData.a[i]++;//数组a内部数据是int型,不是final型,可以修改  /*-----------static final类型测试------------------------------------*/  
//      finalData.VAL_TWO = 4;  //定义为private,只能被本类的方法调用;定义为static,则强调只有一份,且只被执行一次;定义为final,则说明它是一个常量,无法被修改。  }  
}

2、final方法

如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。

  • 把方法锁定,防止任何继承类修改它的意义和实现。

  • 高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

public class FinalDemo {  public void f(){  System.out.println("FianlDemo.f()");  }  public final void g(){  System.out.println("FianlDemo.g()");  }  
}

继承类

public class FinalOverriding extends FinalDemo{public void f(){System.out.println("FinalOverriding.f()");}//    public void g(){//无法覆盖父类的final方法g()
//        System.out.println("FinalOverriding.g()");
//    }
}

3、final类

final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。例如:java.lang.String

4、参考:

  • 《Java编程思想(美)Bruce Eckel著 陈昊鹏 译》


转载于:https://my.oschina.net/forrest420/blog/188330

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一行代码揭开CPU执行原理

参考&#xff1a;一行代码&#xff0c;揭开CPU执行原理&#xff01; 作者&#xff1a;嵌入式ARM 网址&#xff1a;https://mp.weixin.qq.com/s/qFnKhWqBGRCFAnp_KC1dmw 目录1、高级语言2、编译链接3、机器指令4、指令格式5、执行指令拓展总结很多刚刚入坑的小白可能对此完全没有…

redhat 挂载 iso文件 提示 mount :not a directory

redhat 挂载 iso文件 提示 mount :not a directory posted on 2013-12-28 22:26 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/ruiy/p/errors.html

C语言常见编译错误及分析

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

面经——嵌入式常见面试题总结100题(上)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

计算机专业运动会口号,运动会口号押韵有气势 计算机系霸气口号

淡泊明志&#xff0c;宁静致远&#xff0c;团结友爱&#xff0c;顽强拼搏。下面是文艺范收集的运动会口号押韵有气势&#xff0c;计算机系霸气口号&#xff0c;欢迎阅读收藏。1、球进了球&#xff0c;分了就会&#xff0c;不怕**&#xff0c;战无不胜。2、阳光运动&#xff0c;…

1. 观察者模式总结(C++)

1. 介绍 观察者模式&#xff1a;定义了一种“一对多”的依赖关系&#xff0c;让多个观察者对象同时监听一个对象的改变&#xff0c;即当该对象的状态发现改变时&#xff0c;会通知所有它依赖的观察者对象。观察者模式属于行为模式。 意图&#xff1a;定义对象间的一种一对多的依…

面经——嵌入式常见面试题总结100题(下)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

学计算机要不要护发,脱发平时应该注意什么 四个妙招教你如何防止脱发

头发一掉&#xff0c;失去的不仅仅是发丝&#xff0c;还有美丽与颜值&#xff0c;一把把辛酸泪只能往肚子里吞。秃头星人们&#xff0c;如果已经脱发了&#xff0c;日常一定要加倍注意哦&#xff0c;一些错误的护发方法不要踩坑&#xff0c;护理、食疗、良好的生活作息&#xf…

面经——嵌入式软件工程师ARM体系与架构相关

参考&#xff1a;嵌入式软件工程师笔试面试指南-ARM体系与架构 作者&#xff1a;嵌入式与Linux那些事 发布时间&#xff1a; 2021-04-28 15:22:06 网址&#xff1a;https://blog.csdn.net/qq_16933601/article/details/116234673 目录 ARM体系与架构硬件基础NAND FLASH 和NOR F…

下列属于计算机人工智能应用领域的是多选题,每天五道选择题(10)

原标题&#xff1a;每天五道选择题(10)1.在Windows7操作系统中&#xff0c;磁盘维护包括硬盘检查、磁盘清理和碎片整理等功能&#xff0c;磁盘清理的目的是( )。A.提高磁盘存取速度B.获得更多磁盘可用空间C.优化磁盘文件存储D.改善磁盘的清洁度▼答案&#xff1a;B【解析】磁盘…

2019年3月未来教育计算机二级题库,2019年3月计算机二Access考试操作模拟试题001...

2019年3月计算机二Access考试操作模拟试题001浏览次数&#xff1a; 时间&#xff1a;2019/03/28一、基本操作题在考生文件夹中有一个“Acc1.mdb”数据库。(1)在“订单”表的“订单ID”和“客户”字段之间添加“产品ID”和“数量”字段。其中&#xff0c;“产品ID”字段的类…

面经——C/C++常见面试知识点总结附面试真题

参考&#xff1a;C/C 面试题 作者&#xff1a;zhaouc 发布时间&#xff1a; 2015-02-15 15:51:00 网址&#xff1a;https://blog.csdn.net/zhaouc/article/details/43835667 参考&#xff1a;C/C常见面试知识点总结附面试真题----20210529更新 作者&#xff1a;kuweicai 发布时…

计算机控制课程设计体会,计算机控制技术课程设计报告

1课程设计目的…………………………………………………1页码2课程设计题目描述和要求……………………………………1页码3.课程设计报告内容……………………………………………1页码4.心得体会………………………………………………………7页码5.参考数目……………………………

tomcat源码 Connector

Connector容器主要负责解析socket请求&#xff0c;在tomcat中的源码位于org.apache.catalina.connector和org.apache.coyote包路径下&#xff1b;通过上两节的分析&#xff0c;我们知道了Connector是Service的子容器&#xff0c;而Service又是Server的子容器。在server.xml文件…

快速对比UART、SPI、I2C通信的区别与应用

参考&#xff1a;带你快速对比SPI、UART、I2C通信的区别与应用&#xff01; 作者&#xff1a;一口Linux 网址&#xff1a;https://mp.weixin.qq.com/s/4_RSM2jk2W6nTboO1W8HCw 电子设备之间的通信就像人类之间的交流&#xff0c;双方都需要说相同的语言。在电子产品中&#xff…

U-Boot 移植

目录NXP官方开发板uboot编译测试查找NXP官方的开发板默认配置文件_defconfig配置编译NXP官方开发板对应的uboot烧写验证与驱动测试(定位缺少的驱动)在NXP官方U-Boot 中添加自己的开发板添加开发板默认配置文件添加开发板对应的头文件(mx6ull_alientek_emmc.h)添加开发板对应的板…

打印某个进程下的所有线程--Linux环境

2019独角兽企业重金招聘Python工程师标准>>> 1、ps -mp <进程ID> -o THREAD 在当前用户下&#xff0c;列出pid包含的所有线程。 2、ps -mp <进程ID> -o THREAD,tid 在当前用户下&#xff0c;列出pid包含的所有线程信息及本地线程ID (tid)。 3、ps -…

JavaScript笔记(3)

•位操作符 所有的按位操作符的操作数都会被转成补码形式的有符号的32位整数。 运算符用法描述按位与&#xff08;AND&#xff09;a & b对于每一个比特位&#xff0c;只有两个操作数相应的比特位都是1时&#xff0c;结果才为1&#xff0c;否则为0。按位或&#xff08;OR&am…

Linux 内核顶层Makefile 详解

目录前602行分析make xxx_defconfig 过程Makefile.build 脚本分析make 过程built-in.o 文件编译生成过程make zImage 过程前几章我们重点讲解了如何移植uboot 到I.MX6U-ALPHA 开发板上&#xff0c;从本章开始我们就开始学习如何移植Linux 内核。同uboot 一样&#xff0c;在具体…

android第三次作业

界面&#xff1a; 主要代码&#xff1a; 1.定义一个工具类&#xff0c;在这个类中获取音频文件&#xff0c;并且对歌曲名、歌手和时间等进行格式规范&#xff1a; package com.example.administrator.music;import android.content.Context; import android.database.Cursor; i…