final 的定义:
在英文层面上,final 的意思是 "最后的","最终的" 意思,在 Java 中也同样表示出此种含义。
final 的运用对象:
final 适用于修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
final 修饰类:
由于 final 定以后的对象不能进行修改和重载,用 final 修饰的类不能被继承,即不能拥有自己的子类。如果视图对一个已经用 final 修饰的类进行继承,在编译期间或发生错误。
final 修饰变量:
一旦定义了 final 变量并在首次为其显示初始化后,final 修饰的变量值不可被改变。
这里需要注意以下几个问题:
1. final 修饰的变量,无论是类属性、对象属性、形参还是局部变量,这些变量都是需要进行显示初始化(即为其显示指定初始值)。
对于 final 修饰的形参,由于是实参传递过来的,很好理解。
对于 final 修饰的局部变量,与未用 final 修饰的变量一样,都是需要显示初始化。即局部变量都是需要显示初始化的。
对于一般的类属性和对象属性,由类和对象的初始化过程中可以看出,首先都进行了默认初始化。然后对有显示赋值的变量才再进行显示初始化。
但对 final 修饰的类属性和对象属性而言,如果不显示初始化,其默认将是进行默认初始化后的值,这与 final 本身出发点矛盾,因此,Java 语法规定:
final 修饰的类属性和变量属性必须要进行显示初始化赋值。
另外,无论对于基本数据类型还是引用数据类型,final 修饰的变量都是首次显示初始化后值都不能修改。对于基本数据类型,很好理解。对于引用
数据类型,引用变量指向的是实际的对象,但其存储的是所指向对象的地址,因此,其值不能修改并不意味着其所指向的对象不能修改。
final 赋值:
Java 中没有真正的常量。只有 final 型的变量,可以当常量来用。
final 型变量,只有两个地方可以赋值:
1. 在定义的时候可以赋值。
2. 在构造函数中可以赋值。如果在定义时赋值了,则在构造函数中不能赋值。包括定义时赋了 null 值,则在构造函数中也不能再赋值。
例:
- public final String AAAA;
- public Doggie(){
- AAAA="Good Morning";
- }
- public final String AAAA="aaaa";
再举一个特殊的例子作为区别对待:
- public class Test {
- public static void main(String[] args) {
- String country = "China";
- String name = "qqyumidi";
- String userInfo = country + name; //编译后此处依然是country和name变量
- String user = "China" + "qqyumidi"; //编译后此处直接变成Chinaqqyumidi
- }
- }
另一种写法为:
- public class Test {
- public static void main(String[] args) {
- final String country = "China";
- final String name = "qqyumidi";
- String userInfo = country + name; //编译后此处直接是Chianqqyumidi
- }
- }
来源: