zoukankan      html  css  js  c++  java
  • java基础之不可变

    final修饰

    final修饰引用变量时,只是限定了引用变量的引用不可改变,即不能将变量再次引用另一个对象,但是引用的对象的值是可以改变的。

    ps:
    用final关键字修饰方法,它表示该方法被子类继承,但不能被子类的覆盖。这种使用方式主要是从设计的角度考虑,即明确告诉其他可能会继承该类的程序员,不希望他们去覆盖这个方法。
    类中所有的private方法都隐式地指定为是final的,由于无法在类外使用private方法,所以也就无法覆盖它。
    final修饰的类是无法被继承的。它的方法也是final的。

    String

    java.lang.String类是final类型的。

    String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
    

    没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

    String s = new String("xyz");创建了几个String Object?
    

    两个或一个。”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它依据那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。

    为什么要有不可变对象——Immutable设计模式

    (基本类型的包装类都是不可改变的)
    不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。

  • 相关阅读:
    Django复习
    AI-CBV写法
    CHENGDU3-Restful API 接口规范、django-rest-framework框架
    人工智能玩具制作
    POJ 3176 Cow Bowling
    HDU 2044 一只小蜜蜂
    HDU 4662 MU Puzzle
    POJ 3262 Protecting the Flowers
    POJ 1862 Stripies
    POJ 1017 Packets
  • 原文地址:https://www.cnblogs.com/xiaobingzi/p/10819884.html
Copyright © 2011-2022 走看看