final关键字可以修饰变量、方法和类。
1.final修饰变量:
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
举例:final修饰引用类型变量,变量地址不变,但是地址指向对象的值可以改变。
int[] a=new int[3];
final int [] b=a;
System.out.print("B1:"+b+"\n");
System.out.print("B2:"+b[0]+"\n");
a[0]=3;
System.out.print("b1:"+b+"\n");
System.out.print("b2:"+b[0]);
输出:
2.final修饰方法:
只有在想明确禁止该方法在子类中被重写的情况下才将方法设置为final的(类的private方法会隐式地被指定为final方法。)
3.final修饰类:
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
4.final和static
很多时候会容易把static和final关键字混淆,static修饰变量属于类变量,只保存一份副本,而final修饰变量为实例变量。看下面这个例子:
public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);
}
}
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
运行这段代码就会发现,每次打印的两个j值都是一样的,而i的值却是不同的。从这里就可以知道final和static变量的区别了。
参考:http://www.cnblogs.com/dolphin0520/p/3736238.html