在Java的50多种关键字中,static和final是必须要掌握的,不同于其他关键字的是,他们在修饰不同东西时,有着很多不同的方法。若能在恰当的场合合理应用,也能一定程度上提升程序的性能。
final本身是最终的意思,所以按照字面大体理解就是:当一个”东西“一旦被final修饰,就是最后一次了,不能再变了。当然这是不严谨的,下边来详细说明一下final的三种常用用法:
修饰变量
1.修饰基本数据类型的变量
通过final修饰的变量只能被赋值一次,且一生一世不许改变。并且对于局部变量(方法内的变量),在使用该变量前,要对他进行初始化。
final int a = 1;//第一种
final int b;//第二种
b=2;
system.out.println(b);
2.修饰引用型变量
引用变量被final修饰之后,不能再指向其他对象;但是它指向的对象的内容是可变的。
public class Test {
public static void main(String[] args) {
final A a = new A();
System.out.println(++a.i);
}
}
class A {
public int i = 0;
}
//输出结果为1
3.修饰成员变量(方法外的变量)
- 由于成员变量具有默认值,所以被final修饰时需要手动赋值。
- 赋值方式有两种:直接赋值或通过构造方法赋值。
public class Test{
final i =2;
final int a ;
public Test(){
a=1;
}
}
4.final变量与普通变量的区别:
当final变量是基本数据类型或String类型时,当编译器在编译期间就知道了确切值之后,编译器会将其看作常量使用,所以当使用b变量的时候直接替换为它的值;
public class Test {
public static void main(String[] args) {
String a = "helloworld";
final String b = "hello";
String d = "hello";
String c = b + "world";
String e = d + "world";
System.out.println((a == c));
System.out.println((a == e));
}
//输出结果
>true
>false
但有一点需要注意:只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化。
public class Test {
public static void main(String[] args) {
String a = "hello2";
final String b = getHello();
String c = b + 2;
System.out.println((a == c));
}
public static String getHello() {
return "hello";
}
}
//输出结果为false
修饰方法
被final修饰的方法不能被覆盖重写。
修饰符 final 返回值类型 方法名称(参数列表){
// 方法体
}
修饰类
被final修饰的类不能被其他类继承(太监类),并且,其中所有的成员方法都不能被覆盖重写(因为没儿子,当然不能被重写)
public final class 类名称 {
//......
}
总结
- 被final修饰的变量只能赋值一次,不能再改变。成员变量可以直接赋值或在构造方法中赋值
- 被final修饰的引用变量,不能改变引用的指向(只能指向同一处地址),但是能够修改指向对象的内容。
- 被final修饰的方法不能被重写
- 被final修饰的类不能被继承