码迷,mamicode.com
首页 > 编程语言 > 详细

Java之final关键字

时间:2016-08-16 23:32:24      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

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)。
技术分享
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();
}
}





Java之final关键字

标签:

原文地址:http://www.cnblogs.com/linux007/p/5777982.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!