许多语言都提供常量数据用来表示那些既不会改变也不能被改变的数据。java关键词final用来表示常量数据,如:
public static final int HEIGHT = 200;
假如你在以后的代码对 HEIGHT进行修改的话就无法通过编译。
如:
HEIGHT = 120;
假如我们想定义一个常量对象,又该如何呢?
class Circle{
private double rad;
public void setRad(double rad){
rad = rad;
}
public double getRad(){
return rad;
}
}
public class FinalTest{
private static final Circle wheel = new Circle(5.0);
public static void main(String args[]){
wheel.setRad(6.0);
}
}
这个程序可以编译,也可以运行,为什么这个又可以呢?实际上wheel的值并没有改变,我们改变的是wheel所指的对象。wheel并没有变化。仍然指向(代表)同一个对象。变量wheel是一个object reference,它指向对象所在的heap的位置。
假如 执行wheel=new Circle(7.4); 编译这段代码会发生编译错误。由于我们企图改变final型变量wheel的值,所以这个示例将产生编译错误,换言之,代码企图令wheel指向其他对象,变量wheel是final,因此也是immutable(不可变的)。它必须指向同一个对象。然而wheel所指的对象并不受关键词的影响。
假如你想让对象不能修改的话, 就让这个对象为immutable 并且是final的