软件构造3-1数据类型和类型检:
一、静态/动态类型检查:
静态类型语言,在编译阶段进行类型检查。对于编译器的检查主要包含在三个方面:语法检查、类型检查、声明检查。预处理器的工作是进行相关替换:对于头文件的替换、对于条件编译的预处理,对于宏的替换。语法错误,类名、函数名错误,参数数目错误,参数类型错误,返回值类型错误。关于“类型”的检查。
动态类型检查:判断实例是否为某个类型的对象或该类型的子类的对象,判断类型是否为某个类的子类。非法的参数值,非法的返回值,越界,空指针。关于“值”的检查。
二、可变/不变的的数据类型:
改变一个变量:将该变量指向另一个值的存储空间
改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值
Immutability:不变数据类型,一旦被创建,其值不能改变,final类无法派生子类,final变量无法改变值、引用;final方法无法被子类重写。不变对象:一旦被创建,始终指向同一个值,可变对象:拥有方法可以修改自己的值
例:String s = “ab”;String t = s;t = t+”c”;此时s是“ab”,t是“abc”
StringBuilder sb = new StringBuilder(“ab”) StringBuilder tb = sb;
tb.append(“c”);此时tb和sb都是“abc”.。
三、数据类型:
基本数据类型:int,long,byte,short,char,float,double,boolean只有值,没有ID,immutable,在栈中分配内存,代价低
对象数据类型:既有ID,也有值,mutable/immutable,在堆中分配内存,表达式与泛型的统一,代价昂贵
软件构造3-2设计规约:
一、方法的规约:
你这个方法要干啥,输入参数和返回值,写假设是为了让别人懂,让自己记住
二、前置/后置条件
三、欠定规约、非确定规约
四、陈述式、操作式规约
五、规约的强度及其比较
六、如何写出好的规约
软件构造3-3抽象数据类型:
设计良好的抽象数据结构,通过封装来避免客户端获取数据的内部表示(表示泄露)。
ADF的特性:不变量、表示泄露、抽象函数AF,表示不变量RI
一、抽象和用户定义的类型:
抽象类型:强调作用于数据上的操作
二、ADT的操作:
构造器:实现ADT,
生产器:通过该ADT生产一些新的数据,
观察器:观察ADT内部的数据,
变值器:改变数据的值,返回值是void,
三、抽象数据类型的例子:
四、ADT的设计规则
五、
RI:表示独立性,client使用ADT无需考虑内部实现
六、ADT的现实意义
七、ADT测试:
测试构造器,生产器和变值器,调用观察器来观察这些结果
八、不变量:
用private定义变量,使用immutable类型,彻底避免表示泄露
九、RI和AF:
RI表示不变性,说明参数的合法值是什么样的,AF:说明这些参数的现实意义是什么,一一说明这些参数都是什么
CheckRep(),检查不变量,所有可能改变rep的方法内部都要检查
十、有益可变性:
十一、表示泄露
十二、不变量的前置条件
软件构造3-4面向对象编程:
一、OOP的概念:
Object是状态和行为的总和;state是object所包含的数据,behavior是object的动作
Class:每个物体都有一个class,一个类的方法就是它的接口
静态的,static方法可以直接使用,但是不带static的方法需要实例化,并且来对象里面进行调用
接口和类:定义和实现ADT;接口之间可以继承与拓展;一个类可以实现多个接口;一个接口可以有多种实现类
接口:确定ADT规约 类:实现ADT
也可以不需要直接使用类作为ADT,既有ADT定义也有ADT实现
实际中更倾向于使用接口来定义变量
客户端需要知道该接口的某个具体实现类的名字
二、OOP的特征:
封装与信息隐藏;继承与重写;多态,子类型,重载,静态与动态分派
信息隐藏:使用接口类型声明变量,客户端仅使用接口中定义的方法,客户端代码无法直接访问属性
Private:只有声明的类可以用
Protected:声明的类的子类可以用
Public:所有人都可以用
继承与重写:严格继承:子类只能添加新方法,无法重写超类中的方法——超类中的方法都用final定义的
Overrriding:子类重写函数,实际执行哪个方法,运行时决定
父类型中的函数不为空,证明这些子类中有一些是共性的,但是如果为空,证明这些子类都是不一样的,每一个都需要自己去实现这个功能
重写之后,也可以调用super的方法
抽象方法和抽象类:
抽象方法:该方法中有一些东西没有实现:
抽象类:至少含有一个抽象方法没有实现的类为抽象类
接口:只有一个抽象方法的一个抽象类
多态:特殊多态,不同的类型表现出不同的行为,不同的参数,不同的返回值构成虽然方法 的名字是一样的,但是他们执行的功能是不一样的;参数化多态——泛型编程
重载:多个方法具有同样的名字,但是参数列表是不一样的,或者返回值时不一样的,例如java中print可以打印不同的东西,静态方法,接受静态检查
Java中的通配符:在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义
本文深入探讨了软件构造中的关键概念,包括静态与动态类型检查、数据类型的可变性与不变性、抽象数据类型的设计与应用,以及面向对象编程的基本原理。详细解析了OOP的特性如封装、继承、多态,以及接口与类的作用。
448

被折叠的 条评论
为什么被折叠?



