【学习笔记】java基础知识--final
可能使用到final
的三种情况:数据、方法、类。用它修饰的类、方法和变量不可以改变。
final数据
许多编程语音都有某种方法,向编译器告知一块数据是恒定不变的。有时候数据的恒定不表是很有用的比如:
-
一个永远不改变的编译时常量。
-
一个在运行时被初始化的值,而你不希望它被改变。
对于编译期常量这种情况,在Java中这类常量必须是基本数据类型,并却已关键字final
表示,对这个常量定义的时候,必须对其进行赋值。
基本类型final
,一旦获得了初始值就不能被改变,final
使数值恒定不变。
引用类型final
,当对象引用而不是基本类型运用final
时,而用于对象引用,final
使引用(引用类型变量所引用的地址不会改变)恒定不变。一旦引用被初始化指向一个对象,就无法再改变它指向另一个对象。然而,对象其自身却可以被修改的。这一限制同样适用于数组,它也是对象。
说明:java并未提供使任何对象恒定不变的途径,但是可以自己编写类以取得是对象恒定不变的效果。
根据惯例,既是static
又是final
的域(即编译期常量)将用大写表示,并使用下划线分隔各个单词。
空白final
Java允许生成“空白final
”,所谓空白final是指被声明为final
但又未给定初始值。无论什么情况,编译器都确保空白final
在使用前必须被初始化。这一特性使得空白final
在关键字final
的使用上提供了更大的灵活性。为此,一个类中的final
域就可以做到根据对象而有所不同,却又保持其恒定不变的特性。
必须在域的定义处或者每个构造器中用表达式对final
进行赋值,这正是final
域在使用前总是被初始化的原因所在。
final参数
Java允许在参数列表中以声明的方式将参数指明为final
,这意味着无法在方法中更改参数引用所指向的对象。
final成员变量
final修饰的成员变量必须有程序员显示地指定初始值。
归纳起来,final
修饰的类变量、实例变量能指定初始值的地方如下:
类变量:必须在静态初始化块中指定初始化值或声明该类变量时指定初始化值,而且只能在两个地方的其中之一指定。
实例变量:必须在非静态初始化块、声明该变量或构造方法中指定初始值,而且只能在三个地方的其中之一指定。如果这些成员变量没有赋值,那么这些成员变量的值将一直是系统默认分配的,意味着这些变量也就失去了存在的意义。
final局部变量
系统不会对局部变量进行初始化,局部变量必须由程序员显式初始化。因此使用final
修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值,在后面代码对final
赋值,并且只能赋值一次。
小结
对于一个final
变量来说,不管是类变量,实例变量、还是局部变量,只要该变量满足三个条件,这个final
变量就不再是一个变量,而相当于一个直接量。
-
使用
final
修饰符修饰。 -
在定义该
final
变量时指定了初始值。 -
该初始值可以在编译时就确定下来。
final方法
使用final
方法的原因有两个:
-
把方法锁住,以防止继承类修改此方法,这样可以确保在集成中使用方法的行为保持不变,并且不会被覆盖。
-
早期建议使用
final
的第二个原因是效率。java早期实现中,final
方法可以编译成内嵌方法而减少方法调用开销。事实上,这种使用已经被劝阻。在使用java SE5/6时,应该让编译器和JVM去处理效率问题,只有在想要明确禁止覆盖时,才将方法设置为final
。说明:类中所有的
private
方法都隐式的指定是final
。由于无法取用private
方法,所以也就无法覆盖它。可以对private
方法添加final
修饰词,但这并不能给该方法增加任何额外的意义。
final类
当将某个类定义为final
时(通过将关键字final
置于类的定义之前),就表明该类不允许被继承,不会有子类。由于final
类禁止继承,所以final
类中的所有方法都隐式指定是final
- 点赞
- 收藏
- 关注作者
评论(0)