软件构造课程学习感悟及ADT与OOP理解总结

经过一学期对软件构造的学习,学到了不少知识,对软件构造过程及其各个细节都有了不少的认识,现在分享一些自己的学习经验以及对某些知识点的认识。

我觉得对软件构造的学习应该从广到精,先了解软件构造的大体框架,软件构造的过程,然后再继续深入了解各个实现细节。我觉得软件构造最核心的基础知识便是ADT和OOP,接下来跟大家分享一下我对这些知识的了解。

抽象数据类型:ADT

抽象意味着什么:

抽象数据类型是软件工程中一般原理的一个实例,它有许多名称,其意义略有不同:

抽象:用更简单,更高层次的概念来省略或隐藏底层细节。

模块化:将系统划分为组件或模块,每个组件可以与系统的其他部分分开设计,实施,测试,推理和重复使用。

封装:围绕模块构建墙壁(硬壳或胶囊),使模块对其自身的内部行为负责,并且系统其他部分的错误不会损害其完整性。

信息隐藏:从系统的其他部分隐藏模块实现的细节,以便稍后可以更改这些细节,而无需更改系统的其余部分。

 

用户定义类型:

在软件开发方面一个重大的进展就是抽象数据类型的提出。数据抽象的关键思想是:一个类型被可以对其进行的操作特征化。比如说,一个数字是你可以进行加法或者乘法运算的类型,一个字符串是你可以连接或者获得其子字符串的类型等等。从某种意义上说,用户可以在早期的编程语言中定义自己的类型,但是抽象类型的新颖性和不同之处在于它对操作的关注,用户不需要担心它的值是如何存储,只需要知道如何对这些值进行操作。

 

类型分类与操作:

无论是用户自己定义的还是内置的类型,都可以被分为可变的和不可变的。可变类型的对象可以被改变,也就是说,他们提供的操作在执行时会导致在同一个对象上的其他操作给出不同的结果。如Date是可变的,我们可以调用setMonth改变一个对象,并使用getMonth观察变化。String是不可变的,因为他的操作创建了一个新的String对象而不是对现有的String对象进行改变。有时一种类型将以两种形式提供,一种是可变的一种是不可变的。如StringBuild就是String的一个可变版本。

抽象的类型的操作分类如下:

Creator:构造器,创建该类型的新对象。一个创造器可以将对象作为参数,但不是正在创建的类型的对象。

Producer:产生器,从该类型的旧对象产生一个新对象。例如String的concat方法就是一个生产者,他连接两个字符串,产生一个新的字符串。

Observer:观察器,获取抽象类型的对象并返回不同类型的对象。例如List的size方法返回一个int。

Mutator:改变器,改变对象。例如List的add方法通过在List最后添加一个元素改变List

这部分基础知识我觉得最方便的就是用户可以根据自己的需要自行设计实现一些操作,非常实用,这是oop(面向对象编程)的基础。

接下来介绍一下我对一些面向对象知识的认识与感悟:

面向对象编程:OOP

何为对象:

随处可见的一种事物就是对象,对象是事物存在的实体。人们思考这些对象都是由何种部分组成的,通常会将对象划分为动态部分和静态部分。静态部分,顾名思义,就是不能动的部分,这部分被称为“属性”,任何对象都会具备其自身属性。一个人具备的行为行动,就是动态部分。

何为类:

类就是同一类事物的统称,对象是类的实例。如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称。类是构造对象时所以来的规范,具有相同特性和行为的一类事物就称为类,类的思想就是这么产生的。更为恰当地描述是:类是世间事物的抽象称呼,而对象则是这个事物相对应的实体,如果面临实际问题,通常需要实例化类对象来解决。

类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实体被称为类。

在Java语言中,类中对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的,而类包括对象的属性和方法。

(1)同一类事物的统称;

(2)封装一类事物的属性和行为的载体

(3)对象是类的实例

(4)通过类来生成对象

对象和类是面向对象的基石,利用基础的ADT抽象出来类,进而实例化出来一些对象,进而来构造程序,面向对象根据类和对象的关系以及一些属性的性质有以下几大特点:

1.封装

概念:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

好处:• 将变化隔离。• 便于使用。• 提高重用性。• 提高安全性。

封装原则:

• 将不需要对外提供的内容都隐藏起来。

• 把属性都隐藏,提供公共方法对其访问。

Java中可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。

private:类中限定为private的成员,只能被这个类本身访问。如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。

default:类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。

protected:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。

public:类中限定为public的成员,可以被所有的类访问。

 2.继承

继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。

新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

子类可以直接访问父类中的非私有的属性和行为。通过 extends 关键字让类与类之间产生继承关系。如下:class SubDemoextends Demo{}

继承提高了代码的复用性。

继承的出现让类与类之间产生了关系,提供了多态的前提

但是子类无法继承父类final类型,父类权限为private的类型

Java只支持单继承,不支持多继承。一个类只能有一个父类,不可以有多个父类

3.多态

方法的重写、重载与动态连接构成多态性。Java只允许单继承,这样做虽然保证了继承关系的简单明了,但是功能上有很大的限制,所以,Java引入了多态性的概念。此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。

多态性:发送消息给某个对象,让该对象自行决定响应何种行为。

  通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

  java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

  1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。

  2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。

  定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

  所以,父类类型的引用可以调用父类中定义的所有属性和方法,但是对于子类中定义而父类中没有的方法,它是无可奈何的;

  同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;

对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

   

 

软件构造课程还是非常不错的,收获比较大,这只是我参考其他网页材料对其中的一小部分的理解总结,谢谢老师与助教的辛苦付出。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值