在Java中这样定义一个整型常量:
static
final int aImmutableInt = 10;
上边的语句定义了一个常量,并赋初值为10。定义一个常量用到了
final的关键词。如果在程序的任何地方试图改变这个常量的值,都会遭到编译器的拒绝。
那么,我们能否定义一个
常量对象呢?做如下的尝试:
首先定义了一个Circle类:
class Circle
{
private double radius;
public Circle(double r)
{
radius = r;
}
public void setRadius(double r)
{
radius = r;
}
public double getRadius()
{
return radius;
}
}
下面,定义一个用final修饰的对象wheel,并试图改变它:
public class FinalTest
{
private static final Circle wheel = new Circle(5.0);
public static void main(String args[])
{
System.out.println("Radius of wheel is " + wheel.radius());
wheel = setRadius(7.4);
System.out.println("Radius of wheel is now " + wheel.radius());
}
}
这时编译器会很爽快地答应,并输出如下结果:
Radius of wheel is 5.0
Radius of wheel is now 7.4
这是为什么呢?
在实践一中谈到了,在java中定义一个对象,这个对象名就是这个对象的一个引用,这个引用的值是内存中的一个地址。在上边的例子中,用final修饰的
是对象的引用的值,而引用类似于一个地址,这里好像就是在对这个引用说:嘿,哥们,你只能指向这个对象了,不能再指向其他的对象了!
而在我们的程序中,这个引用的值确实没有改变,被改变的只是对象的属性值,所以不会报错!
如果把
wheel = setRadius(7.4);换成wheel = new Circle(7.4);则肯定不能编译通过。不信?你就试试!