浅谈final

来源:互联网 发布:制影集的软件 编辑:程序博客网 时间:2024/05/16 15:49

1>    Final关键字表示的含义是“无法改变的”。

2>    它可以修饰:数据方法

3>    【final修饰——数据】

a>    应用范围

一个永不改变的编译时常量。(必须是基本数据类型)

一个在运行时被初始化的值,而你不希望他被改变。

b>    一个既是static又是final的域只占据一段不能改变的存储空间

c>     final+基本数据类型——>表示数值恒定不变。

final+对象引用类型包含数组——>表示引用恒定不变,对象自身却是可以改变的。

d>    static  final ——>编译期常量

e>    不能因为某数据是final的就认为在编译时可以知道它的值。例如:

Private static Random rand = new Random(47);

f>    final定义为静态和非静态的区别。

在编译期是这个两种在编译器眼中是一样的,只有在运行期初始化时,才有区别。一个是只生成唯一的值,另一个则会随着类被实例化N次,而产生N个值。

g>    空白final

private final int i;  即在声明时不给它赋值,这样在构造方法中给它赋值,就可以做到根据对象不同而有所不同,但是却又能保持其恒定不变的特性。

要在构造方法中对i进行赋值。

h>    final参数

你可以读参数,但是却不允许修改参数,这一特性主要用来向匿名内部类传递数据。

4>    【final修饰——方法】

a>    使用final修饰方法只有两种可能性:

第一种:把方法锁定,防止任何继承类修改它的含义。

第二种:提高效率(针对老的jdk,在线的jdk5以上版本已经失去作用)。

b>    所有的private方法都隐式的指定为final,但也可以对private方法增加final添加词,但这并不能给方法增加任何额外的意义。例如“

private final void f() 相当于 private void f() ,如果有子类,子类也可以有跟父类一样的私有方法f(),但是这却并不是“覆盖“,只是和父类所属方法f()一样名称的私有方法而已。

5>    【final修饰——类】

a>     当将某个类的整体定义为final时,就表明了你不打算继承该类,也不希望它有子类。

final class a{

… …

}

b>     注意:final类的域可以根据个人的意愿选择为是或者不是final。不论类是否被定义为final,相同的规则都适用于定义为final的域。然而,由于final类禁止继承,所以final类中所有的方法都隐式指定为final的,因为无法覆盖它们。在final类中可以给方法添加final修饰词,但这不会增添任何意义。