如果要用到final关键字,一般是处于效率或者设计的考虑。final一般用于类,方法,变量(成员变量,局部变量 )。
- final修饰类。表示该类不能被继承。通常这个是处于安全的考虑。比如String就是一个final类,而且final的方法默认是final的,也就是不能被继承,就自然不存在重写。为什么String是final定义的呢?我想处于两点:其一:安全性,String里面有很多方法是直接跟操作系统通信的,如果这个类可以被继承,那么就是说可以被修改的,那么任何一个继承这个类的人都可以对其中方法进行重写,是一件很不安全的事情。其二:处于效率。因为字符串被用的频率实在是太高了,处于效率设计成final的类,一旦这个类的对象被创建就不能被修改了。而且该类的对象只具有可读性,可以在多线程环境下共享,而不需要额外的同步开销。
- final修饰方法,表示该方法不能被重写。
- final定义变量。如果修饰的是基本数据类型,也就是说一旦变量被初始化便不能更改。如果修饰的是引用类型,一旦初始化之后,其引用不能指向别的对象。
实例:
package com.wang.test;
public class FinalTest {
public int w1 = 5;
static int w2 = 8;
private static final int w3 = 10;
Apple apple1 = new Apple(6);
static final Apple apple2 = new Apple(9);
static Apple apple3 = new Apple(10);
public static void main(String[] args){
FinalTest test = new FinalTest();
//静态方法不能调用非静态方法,由于非静态变量需要对象访问。
System.out.println(++test.w1);
System.out.println(++w2);
System.out.println(w2);
<span style="background-color: rgb(255, 0, 0);">System.out.println(++w3);</span>
System.out.println(apple3);
<span style="background-color: rgb(255, 0, 0);">apple2 = apple3;</span>
}
}
class Apple{
private int i = 9;
public Apple(int i){
this.i = i;
}
public void setI(int i){
this.i = i;
}
public int getI(){
return i;
}
}
第一个红色之处,有一个错误:The final field FinalTest.w3 cannot be assigned
第二个红色之处,有一个错误:The final field FinalTest.w3 cannot be assigned
由此可以看到,一旦变量被定义为final且初始化之后,其引用是不能指向另一个对象的。