对不变的data和object references 使用final(注意这里指的是references而不是对象)

许多语言都提供常量数据用来表示那些既不会改变也不能被改变的数据。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的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值