1. 什么是 final
final 是 java 中的关键字,表示“最终的,不可变的”。
final 就相当于一把锁
,而且这把锁的钥匙还丢了,所以被他修饰的所有东西都是最终的。
现实生活中我们常用到的和 final 相关的英语短语:
final exam : 期末考试
复制代码
哈哈哈,话题扯远了,我们接着说 java 中 final 的用法。
2. final 用法
2.1 final 修饰的变量只能赋一次值
例如:
上面的例子中 final 修饰的 name 表示最终变量。
2.2 final 修饰的类无法继承
举个不好听的例子,被 final 修饰的类就像个“太监”一样,所以没有后代,没有人可以继承他。
2.3 final 修饰的方法无法覆盖
就像女娲造人这一绝招既不传男也不传女。
2.4 final 修饰的引用不能重新指向其他对象
上面的例子中 final 修饰的 animal1 引用不能再指向一个新的对象,但是 animal1 指向的对象还可以修改属性值,例如:
public class Animal {
String name;
public static void main(String[] args) {
final Animal animal1 = new Animal();
animal1.name = "哈士奇";
System.out.println(animal1.name);
System.out.println("-----------");
animal1.name = "牧羊犬";
System.out.println(animal1.name);
}
}
复制代码
运行结果:
这就相当于某地颁发限房令之后,每个人凭身份证只能购一套房,虽然不能买第二套房了,但是房子里的家具我可以随便换。
2.5 final 修饰的实例变量必须初始化
因为 final 的意思是最终的,你不赋值相当于刚开始是空值,后面还可以赋值,就与 final 的意思前后矛盾了。
2.6 final 和 static 连用
在实际开发中,我们一般不会扯淡到用一个 final 修饰一个类,不让其他类继承。也不会扯淡到用 final 修饰一个方法,不让其他类重写。更不会扯淡到专门用 final 修饰一个对象,感觉这个对象多牛逼似的。
我们一般会把 final 和 static 连用,用来表示一些常量
。
例如:
// OSS相关常量类
public class ConstantsOSS {
public static final String DEFAULT_CHARSET = "UTF-8";
public static final Integer INPUT_BUFFER_SIZE = 256;
public static final int GB = 1024 * 1024 * 1024;
}
复制代码
因为 static 修饰的变量是和类相关的,直接可以用 类名.变量名
获取,而 final 修饰的变量又表示不可修改的,所以 static 和 final 修饰的变量又叫常量
,也就是永久不可修改的变量。
使用的时候我们直接类名.变量名
获取数据,例如:
public class FinalTest {
public static void main(String[] args) {
System.out.println(ConstantsOSS.DEFAULT_CHARSET);
System.out.println(ConstantsOSS.GB);
System.out.println(ConstantsOSS.INPUT_BUFFER_SIZE);
}
}
复制代码