2020春季学期哈工大软件构造学习心得三

Abstract Data Type (ADT) and ObjectOriented Programming (OOP)

前言
前两章回答了:什么是“高质量的软件”、 如何从不同维度刻画软件、软件构造的基本过程和步骤
本章:软件构造的理论基础——ADT ;软件构造的技术基础——OOP

程序设计语言中的数据类型
Java有几种基本数据类型

  • int (for integers like 5 and -200, but limited to the range ± 2^31, or roughly ± 2 billion)
  • long (for larger integers up to ± 2^63)
  • boolean (for true or false)
  • double (for floating-point numbers, which represent a subset of the real numbers)
  • char (for single characters like ‘A’ and ‘$’ )

对象数据类型

  • String字符串表示字符序列
  • BigInteger表示任意大小的整数
基本数据类型对象引用类型
Immutable 不可变的可变或不可变
在栈中分配内存在堆中分配内存
代价低代价高

将基本类型包装为对象类型,通常是在定义集合类型的时候使用它们,一般情况下,尽量避免使用,一般可以自动转换

Overloading operators/operations 重载
同样的操作名可用于不同的数据类型
对于Java中的数值原语类型,算术运算符+、-、*、/重载严重。

java是静态类型语言
所有变量的类型在编译时(在程序运行之前)是已知的,因此编译器也可以推断出所有表达式的类型。在编译阶段进行类型检查
相反,类似Python的动态类型语言在运行阶段进行类型检查
对bug的捕捉能力:静态类型检查 >> 动态 >> 无检查,原因是静态类型检查可在编译阶段发现错误,避 免了将错误带入到运行阶段,可提高程序正确性/健壮性

Static checkingDynamic checking
语法错误,类名/函数名错误,参数数目错误,参数类型错误,返回值类型错误,非法的参数值,非法的返回值, 越界, 空指针
关于“类型”的检查,不考虑值关于“值”的检查

一些真正应该动态检查的错误根本就不会被检查
例如,整数除法:5/2不返回分数,它返回一个截断的整数。整数溢出。如果计算结果太正或太负而无法适应这个有限的范围,它会悄悄地溢出并返回一个错误的答案。(无静态/动态检查!)

可变性与不变性
改变一个变量:将该变量指向另一个值的存储空间
改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。
不变性:重要设计原则
不变数据类型:一旦被创建,其值不能改变
不变对象:一旦被创建,始终指向同一个值/引用
可变对象:拥有方法可以修改自己的值/引用

如果是引用类型,也可以是不变的(要使引用不可变,请使用关键字final声明它):一旦确定其指向的对象,不能再被改变
如果编译器无法确定final变量不会改变,就提示错误,这也是静态类型检查的一部分。
尽量使用 final变量作为方法的输入参数、作为局部变量。
final类无法派生子类;final变量无法改变值/引用;final方法无法被子类重写

因为字符串String是不可变的,一旦创建,字符串对象总是具有相同的值,要在字符串末尾添加内容,必须创建一个新的字符串对象
StringBuilder是可变类型的一个示例。它具有删除字符串部分、插入或替换字符等方法。此类具有更改对象值的方法,而不仅仅是返回新值:

当只有一个引用指向该值,可变性与不变性没有区别使用
不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收),但不可变类型更“安全”, 在其他质量指标上表现更好
可变类型最少化拷贝以提高效率,使用可变数据类型,可获得更好的性能,也适合于在多个模块之间共享数据

例,使用时间Date进行引用比较等
使用时间Date时,使用包中的一个类java.time.:LocalDateTime、Instant等。它们的规范都保证它们是不可变的。或者通过防御式拷贝,返回一个全新的Date对象,大部分时候该拷贝不会被客户端修改,可能造成大量的内存浪费。如果使用不可变类型, 则节省了频繁复制的代价

安全的使用可变类型:局部变量,不会涉及共享;只有一个引用 ;如果有多个引用(别名),使用可变类型就非常不安全

Software construction: transformation btw views
在这里插入图片描述
快照图(Snapshot diagrams)表示程序在运行时的内部状态——其堆栈(正在进行的方法及其局部变量)和堆(当前存在的对象)
快照图为我们提供了一种可视化的方法来区分更改变量和更改值之间的区别:
当您分配给变量或字段时,您正在更改变量箭头指向的位置。你可以把它指向另一个值。
当你给一个可变值的内容赋值时,比如数组或列表,你就是在改变这个值里面的引用。
不可变对象:用双线椭圆,如String s = “a”; s = s + “b”;
在这里插入图片描述
Java提供了不可变的引用:只分配一次而从不重新分配的变量。
要使引用不可变,请使用关键字final,如果Java编译器不相信您的final变量在运行时只被赋值一次,那么它将产生编译器错误。所以final对不可变的引用进行了静态检查。在快照图中,不可接受的参考(最终)用双箭头表示。
在这里插入图片描述
引用是不可变的,但指向的值却可以是可变的。可变的引用,也可指向不可变的值
在这里插入图片描述
对象是值,在快照图中用圆圈表示,不可变的对象有一个双边框,表示它从不更改其值。
引用是指向对象的指针,由快照图中的箭头表示,不可变引用是带有双线的箭头,表示不能移动箭头以指向其他对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值