Java 中的不可变类

Java不可变类
  • 不可变类(Immutable Objects):当类的实例一经创建,其内容便不可改变,即无法修改其成员变量。
  • 可变类(Mutable Objects):类的实例创建后,可以修改其内容。

Java 中八个基本类型的包装类和 String 类都属于不可变类,而其他的大多数类都属于可变类。

        String s = "laoqiang";
        System.out.println(s);
        s = "newlaoqiang";
        System.out.println(s);

这样的代码似乎好像是可以修改的,其实不然,第二次赋值的时候,已经构造了一个新的实例对象,并s指向了它。原来的对象还在那。

引用不可变

实例的引用的不可变。

使用关键字 final 修饰的字段初始化后是不可变的,而这种不可变就是指引用的不可变。具体就是该引用所指对象的内存地址是不可变的,但并非该对象不可变。

    Test211 t = new Test211();
        final MyInner m = t.new MyInner();
        //m=  t.new MyInner();该语句无法编译,m的引用指向不可以改变
        m.age = 20;
        System.out.println(m.age);//该对象的属性是可以修改的
    }
    class MyInner{
        private  int age = 10;

    }

看到这里,你一定想去final修饰常量的形式:

    public final static int age = 10;
    public static void main(String[] args) {
    age = 12;//编译无法通过,我们在之前说过,这
    //里的赋值,实际上是开辟了一个新的实例对象,而final修饰
    //的字段,它的指向是不能改,所以编译不过

    }
不可变类的实现

对于成员变量的赋值,采用的是clone方法,如果成员变量是引用类型,那么就要按照深拷贝去处理,详细可以查看我的文章这里写链接内容

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值