博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java之final关键字
阅读量:4611 次
发布时间:2019-06-09

本文共 1863 字,大约阅读时间需要 6 分钟。

1、final类

    final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时若不需要有子类,类的实现细节不允许改变,并且确信不会再被扩展,那么就设计为final类。

2、final方法

    如果类的某个方法不允许子类覆盖,则可以把该方法声明为final方法。
使用final方法的原因有二:
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

3、final变量(常量)

    final修饰的成员变量表示常量,值一旦给定就无法改变!其
修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
一旦给final变量初值后,值就不能再改变了。
    另外,final变量定义的时候,可以先声明而不给初值,这使得
一个类中的final类型成员可以实现依对象而有所不同,却又保持其恒定不变的特征。【前提是,
编译器必须确保final数据在使用之前被初始化

4、final参数

    当函数参数为final类型时,允许读取参数,但无法修改参数值。

拓展学习

内部类访问方法参数必须添加final修饰符

public void mRun(final String name) {
new Thread(new Runnable() {
@Override public void run() {
try {
Thread.sleep(1000); } catch (InterruptedException e) {
// TODO Auto-generated catch block e.printStackTrace(); } System.out.println(name); } }).start(); }
name变量添加final修饰符的原因分析:
此时内部类的生命周期是成员级别的,而局部变量的生命周期实在方法体之类。此时会出现一种特殊情况,
mRun方法执行完之后,此时name变量已经不再内存当中,但线程中依旧需要name变量。为杜绝该种情况,Java严格要求内部类中访问局部变量,必须使用final关键字修饰,此时会在内存中保有一份局部变量的复制品,内部类访问时便访问这个复制品。

final修饰的变量表示只允许实例化一次

final FinalEntity entity = new FinalEntity("王俊", 23, new Student()); lg.e(entity.toString()); entity.str = "新的任务"; entity.stu = new Student(); entity.intValue = 100; lg.e(entity.toString()); entity=new FinalEntity("新的Str",99,new Student());//编译错误
运行结果如下分析可知,final修饰的变量仅可实例化一次,但其内部的成员变量可任意修改(即使这里修改FinalEntity类为final)。
附上FinalEntity源码如下
public class FinalEntity {
public String str; public Integer intValue; public Student stu; public FinalEntity(String str, Integer intValue, Student stu) {
this.str = str; this.intValue = intValue; this.stu = stu; } @Override public String toString() {
return super.toString() + "***" + str + "***" + intValue + "***" + stu.toString(); } }

转载于:https://www.cnblogs.com/linux007/p/5777982.html

你可能感兴趣的文章
Bogart BogartAutoCode.vb
查看>>
JavaScript面试题
查看>>
[转帖]架构师眼中的高并发架构
查看>>
ios的一些开源资源
查看>>
HTTP 错误 500.21 - Internal Server Error 解决方案
查看>>
Bucks sign Sanders to $44 million extension
查看>>
【PHP】Windows下配置用mail()发送邮件
查看>>
ssm项目中 数据库和资源的备份
查看>>
HDU5950【矩阵快速幂】
查看>>
在线C++编译器
查看>>
C#中各种serialization的比较
查看>>
P2617 Dynamic Rankings
查看>>
工作学习常识1
查看>>
Eclipse插件项目中读取文件
查看>>
jquery定义链接跳转的高亮显示
查看>>
CheckListBox怎样得到多选值?
查看>>
三道题(关于虚表指针位置/合成64位ID/利用栈实现四则运算)
查看>>
Vijos P1243 生产产品 (单调队列优化DP)
查看>>
mysql 数据表操作 目录
查看>>
iOS常用第三方库 -转
查看>>