在软件构造课程的第三章
Abstract Data Type (ADT) and Object Oriented Programming (OOP)
中主要分为五个子章节
- 3-1 Data Type and Type Checking 数据类型与类型检验
- 3-2 DesigningSpecification 设计规约
- 3-3 Abstract Data Type (ADT) 抽象数据类型
- 3-4 Object-Oriented Programming (OOP)面向对象的编程
- 3-5 Equality in ADT and OOP ADT和OOP中的“等价性”
下面我们边分别对这五个子章节进行总结
3-1 Data Type and Type Checking 数据类型与类型检验
3.1.1 有关数据类型
java中数据类型又可分为**Primitives(基础数据类型)**和 Object Reference Types(引用数据类型)
他们之间存在如下的特征与区别
Primitives | Object Reference Types |
---|---|
int, long, byte, short, char, float, double, boolean | Classes, interfaces, arrays, enums, annotations |
No identity except their value 只有值,没有ID (与其他值无法区分) | Have identity distinct from value 既有ID,也有值 |
Immutable 都是不可变的 | Some mutable, some not 存在可变/不可变 |
On stack, exist only when in use 在栈中分配内存 | On heap, garbage collected 在堆中分配内存 |
Can’t achieve unity of expression | Unity of expression with generics Dirt cheap |
代价低 | More costly代价昂贵 |
3.1.2有关对象
对于对象数据类型 又存在一个结构层次
所有的对象都是继承于Object 这个类
除Object以外的所有类都具有一个父类,并通过extend子句指定,如果省略extends子句,则默认为Object
如下图所示:
而一个类是其所有父类的实例,机制如下:
- 从其父类继承非private的属性和方法
- 可以重写父类的方法以更改其行为
为了方便的使用基本数据类型,将基本类型包装为对象类型 例如: Boolean, Integer, Short, Long, Character, Float, Double
有以下几点需要注意:
- 通常是在定义集合类型的时候使用它们
- 一般情况下,尽量避免使用
- 一般可以自动转换
3.1.3静态与动态数据类型检查
Java是一门静态类型语言 ,在编译阶段进行类型检查 (可在编译阶段发现错误,避 免了将错误带入到运行阶段,可提高程序正 确性/健壮性)
对于静态类型检查,通常有:
- Syntax errors 语法错误, like extra punctuation or spurious words. Even dynamically-typed languages like Python do this kind of static checking.
- Wrong names 类名/函数名错误, like Math.sine(2) . (The right name is sin)
- Wrong number of arguments 参数数目错误, like Math.sin(30, 20) .
- Wrong argument types 参数类型错误, like Math.sin(“30”) .
- Wrong return types 返回值类型错误, like return “30”; from a function that’s declared to return an int .
而动态类型检查又可分为:
- Illegal argument values 非法的参数值.
- Unrepresentable return values 非法的返回值
- Out-of-range indexes 越界
- Calling a method on a null object reference. 空指针
3.1.4 Mutability and Immutability——可变性和不变性
对于我们在程序中对一个内容进行修改,存在两种修改的方式:
- 改变一个变量:将该变 量指向另一个值的存储空间
- 改变一个变量的值:将 该变量当前指向的值的存储空间中写入一个新的值。
而为了尽可能维护我们的程序的稳定性,我们需要尽可能避免变化,以避免副作用
那我我们就要引入 Immutability 不变数据类型: 一旦被创建,其值不能改变
而Java也给我们不变性的一个参考:variables that are assigned once and never reassigned. 变量一经确定就不能重新再指定
如果是引用类型,也可以是不 变的:一旦确定其指向的对象,不能再被改变
所以我们可以尽量使用 final变量作为方法的输入参数、作为局部变量。
而final这个修饰符对其修饰的变量又有以下的定义:
- final类无法派生子类
- final变量无法改变值/引用
- final方法无法被子类重写
综上,可变性和不变性的边界就被划分出来了:
对于不变对象:一旦被创建,始终指向同一个值/引用
对于 可变对象:拥有方法可以修改自己的值/引用
对于不可变的变量类型,我们需要避免其表示泄露,采用防御式拷贝,给客户端返回一个全新的对象