软件构造第八次学习博客——ADT、OPP总结
一、抽象数据类型:ADT
1.抽象:用更简单,更高层次的概念来省略或隐藏底层细节。
2.模块化:将系统划分为组件或模块,每个组件可以与系统的其他部分分开设计,实施,测试,推理和重复使用。
3.封装:围绕模块构建墙壁(硬壳或胶囊),使模块对其自身的内部行为负责,并且系统其他部分的错误不会损害其完整性。
4.信息隐藏:从系统的其他部分隐藏模块实现的细节,以便稍后可以更改这些细节,而无需更改系统的其余部分。
5.用户定义类型:
在软件开发方面一个重大的进展就是抽象数据类型的提出。数据抽象的关键思想是:一个类型被可以对其进行的操作特征化。。
6.类型分类与操作:
无论是用户自己定义的还是内置的类型,都可以被分为可变的和不可变的。可变类型的对象可以被改变,也就是说,他们提供的操作在执行时会导致在同一个对象上的其他操作给出不同的结果。
7.抽象的类型的操作分类如下:
Creator:构造器,创建该类型的新对象。一个创造器可以将对象作为参数,但不是正在创建的类型的对象。
Producer:产生器,从该类型的旧对象产生一个新对象。例如String的concat方法就是一个生产者,他连接两个字符串,产生一个新的字符串。
Observer:观察器,获取抽象类型的对象并返回不同类型的对象。例如List的size方法返回一个int。
Mutator:改变器,改变对象。例如List的add方法通过在List最后添加一个元素改变List
二、面向对象编程:OOP
1.对象:随处可见的一种事物就是对象,对象是事物存在的实体。人们思考这些对象都是由何种部分组成的,通常会将对象划分为动态部分和静态部分。静态部分,顾名思义,就是不能动的部分,这部分被称为“属性”,任何对象都会具备其自身属性。一个人具备的行为行动,就是动态部分。
2.类:类就是同一类事物的统称,对象是类的实例。如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称。类是构造对象时所以来的规范,具有相同特性和行为的一类事物就称为类,类的思想就是这么产生的。更为恰当地描述是:类是世间事物的抽象称呼,而对象则是这个事物相对应的实体,如果面临实际问题,通常需要实例化类对象来解决。
在Java语言中,类中对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的,而类包括对象的属性和方法:
(1)同一类事物的统称;
(2)封装一类事物的属性和行为的载体
(3)对象是类的实例
(4)通过类来生成对象
根据类和对象的关系以及一些属性的性质有以下几大特点:
1.封装
(1)概念:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:• 将变化隔离。• 便于使用。• 提高重用性。• 提高安全性。
(2)封装原则:
• 将不需要对外提供的内容都隐藏起来。
• 把属性都隐藏,提供公共方法对其访问。
Java中可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。
private:类中限定为private的成员,只能被这个类本身访问。如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
default:类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。
protected:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
public:类中限定为public的成员,可以被所有的类访问。
2.继承
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。
新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
子类可以直接访问父类中的非私有的属性和行为。通过 extends 关键字让类与类之间产生继承关系。
继承提高了代码的复用性。
继承的出现让类与类之间产生了关系,提供了多态的前提
但是子类无法继承父类final类型,父类权限为private的类型
Java只支持单继承,不支持多继承。一个类只能有一个父类,不可以有多个父类
3.多态
方法的重写、重载与动态连接构成多态性。Java只允许单继承,这样做虽然保证了继承关系的简单明了,但是功能上有很大的限制,所以,Java引入了多态性的概念。此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。
多态性:发送消息给某个对象,让该对象自行决定响应何种行为。
通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。
java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。