软件构造- 易混的可变与不可变数据类型

Type and variables

基本数据类型

  • int long Boolean double char

    1. 只有值,没有id
    2. 不可变的、在栈中分配内存
    3. 对象数据类型
  • Classes interfaces arrays enums annotations

    1. 既有id也有值
    2. 有的可变有的不可变、在堆中分配内存
  • 所有对象均继承于object类

操作

  • 操作是把输入映射到输出的函数

    1. 操作符:Int × int → int
    2. 方法: biginteger × biginteger → biginteger
    3. 函数:Sin: double → double
  • 操作符重载

  • 方法重载

静态类型检查与动态类型检查

  • 类型转换:
  1. 隐式:Double a= 2
  2. 强制: int a = (int) 18.7;
  • 类型不匹配错误:int a = 18.7; 不匹配类型

  • Java是静态类型语言

    • 所有量的类型在编译时(在程序运行之前)是已知的,因此编译器也可以推断所有表达式的类型
    • 在编译阶段进行类型检查
      1. 类型不匹配
      2. 操作应用在错误类型的参数
      3. 语法错误
        1. 类名,函数名拼写错误
        2. 参数数目错误
        3. 参数类型错误
        4. 返回值类型错误
  • 动态类型检查会检查越界和空指针


  • 静态检查→关于“类型”的检查,不考虑值
  • 动态检查→关于“值”的检查

可变性和不可变性

  • 改变一个变量:将该变量指向另一个值的存储空间

  • 改变一个变量的值:将该变量指向的存储空间写入一个新值

尽可能避免变化,以避免副作用

不变性

  1. 不变数据类型:一旦被创建,其值不能改变

  2. 不可变引用:一旦确定指向的对象,不能再被改变

  3. 不变对象 : 一旦被创建,始终指向同一个值/引用

  • 使用final关键字

    1. final类无法派生子类
    2. final变量不发修改值/引用
    3. final方法无法
  • String 是不可变类型

    • 一旦被创建,总是只有一个值
    • 每次基于旧串更改,都需要创建一个新串
    • 相对应的StringBuilder 为可变类型 -->> 可以删除子串、插入或替换字符(基于原对象)
      在这里插入图片描述
  • 使用不可变类型,频繁修改会产生大量的临时拷贝(需要进行垃圾回收)

  • 可变类型最少化拷贝会提高效率 、可以提高性能、也适合在多个模块间共享数据

  • 不可变性更加安全、在其他质量指标上表现更好

  • 当传递可变对象时候,方法可能会修改对象的值,导致后续的错误
    在这里插入图片描述

  • 返回可变对象时也可能会导致错误

    • 使用防御式拷贝,给客服端返回一个全新的对象
      • 不过大部分时间该拷贝不会被客服端修改,可能会造成大量的内存浪费
      • 如果使用不可变类型则节省了频繁拷贝的代价

别名使得可变类型具有风险

  • 局部变量不会涉及共享,只有一个引用很安全
  • 多个引用指向同一个可变对象,则会很不安全
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值