第三章 ADT与OOP——1. 数据类型基础

第三章ADT与OOP的知识清单:

1. 基本数据类型对象数据类型
2. 静态类型检查、动态类型检查
3. 值的改变、引用的改变
4. Mutable/Immutable
5. 防御式拷贝
6. snapshot diagram
7. specification、前置后置条件
8. 行为等价性
9. 规约的强度
10. ADT操作的四种类型
11. 表示独立性
12. 表示泄漏
13. 不变量、表示不变量RI
14. 表示空间、抽象空间、AF
15. 以注释的形式撰写AF、RI
16. 接口、抽象类、具体类
17. 继承、override
18. 多态、overload
19. 泛型
20. 等价性equals()与==
21. equals()的自反、传递、对称

22. hashCode()

23. 可变对象的观察等价性、行为等价性


1.基本数据类型与对象数据类型

基本数据类型(primitive types):

int、 long、boolean、 double、 char……

对象数据类型(object types):

Integer、Long、Boolean、Double、String、StringBuilder……

Java约定中,基本数据类型是以小写字母开头,而对象类型以大写字母开头。

下图很好的说明了二者的区别:

boxed primitives:将基本类型包装为对象类型,例如Boolean, Integer, Short, Long, Character, Float, Double。通常是在定义集合类型的时候使用它们。一般情况下,尽量避免使用。一般可以自动转换。


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

静态类型检查 static checking:在程序运行之前检查发现bug。在编译阶段发现错误,避免了将错误带入运行阶段,可提高程序的正确性与健壮性。其主要检查目标包括:

  • 语法错误(Syntax errors)
  • 类名/方法名错误(Wrong names)
  • 参数数目错误(Wrong number of arguments)
  • 参数类型错误(Wrong argument types)
  • 返回值类型错误 (Wrong return types)


动态类型检查 Dynamic checking:在程序运行中检查发现bug。其主要检查目标包括:

  • 非法的参数值 (Illegal argument values)
  • 非法的返回值 (Unrepresentable return values)
  • 越界 (Out-of-range indexes)
  • 空指针 (Calling a method on a null object reference)


此外还有一种无检查:这种不会帮助使用者查找bug,需要亲自检查错误。

显然静态类型检查要优于动态类型检查要优于无检查。

静态检查与动态检查对比:静态检查是关于“类型的检查”,不考虑值,而动态检查是关于“值”的检查。


3.值的改变与引用

首先先来讨论一个问题,改变一个变量与改变一个变量的值有何区别?

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


4.Mutability与Immutability


Immutability不变性:

对于immutable类型的变量,一旦被创建出来其值不能被改变。如果是引用类型,一旦确定其指向的对象也不能在改变。

对于这种变量可以用final关键词修饰,注意如果编译器无法确定final变量不会改变,就会提示错误,这是静态检查的一部分。实际编程中应尽量使用final变量作为方法的输入参数、作为局部变量。其代表了程序员的一种设计决策。

注意:

  • final类无法派生子类
  • final变量无法改变值与引用
  • final方法无法被子类重写

需要注意的是:String类型是immutable类型,而StringBuilder才是mutable类型

二者快照图(snapshot diagram)对比:



此时看没有区别,但当引用变多时就会出现不一样的结果,例如:


另外使用immutable类型时如果频繁修改会产生大量的临时拷贝,GC负担就重了。此时最好用mutable类型。

关于immutable与mutable数据类型区别:immutable类型更安全,而mutable类型则在其他质量指标上表现更好,实际使用选择应该具体情况。


5.防御式拷贝

当类中的一个方法返回了一个可变的成员变量时,而且不希望其被用户修改时,可以采用防御式拷贝的策略进行编程。

方法较为简单,现只给出一个简单的示例:

存在风险代码:


进行防御式拷贝后:



6.快照图(Snapshot diagram)

Snapshot 是一个code-level, run-time, and moment view。用于描述程序运行时的内部状态 ,好处是用于描述程序运行时的内部状态 ,便于刻画各类变量随时间变化 ,便于解释设计思路

具体使用方法:



若对象是不可变对象用双线椭圆:


当值改变时:



不可变引用:用双线箭头。


注意:此时引用是不可变的,但是指向的值是可变的,可变的引用,也可指向不可变的值。



猜你喜欢

转载自blog.csdn.net/qq_37549266/article/details/80697611