大话设计模式系列之面向对象基础(一)

前言:
读到《大话设计模式》此书的附录 A 部分时,始觉匆匆而过,实际阅读时,发现了太多忽视的点儿,同样的文字,不同的时期进行阅读确实有新的感悟。温故而知新,可以为师矣。本文会增加我的读书笔记与思路与大家共勉。

基础定义

对象:对象(Object Oriented Programming)是一个自包含的实体,用一组可识别的特性和行为来标识。

:类就是具有相同的属性和功能的对象的抽象的集合。

实例:实例化就是创建对象的过程,从类中剥离出的个体。

构造方法:构造方法又叫作构造函数,其实是对类进行初始化。构造方法与类同名,无返回值,也不需要 void,在 new 时候调用。

方法重载

  • 定义:两个方法的方法名相同,但参数类型或个数不同,则称作对原有方法的重载
  • 作用:提供了创建同名的多个方法的能力,在不改变原方法的基础上,新增功能。

字段:字段是存储类要满足其设计所需要的的数据,字段是与类相关的变量。

私有的:private
表示只允许同一个类中的成员访问,其他类包括它的子类无法访问,俗称私有的。

共有的:public
表示它所修饰的类成员可以允许其他任何类来访问,俗称公有的。

面向对象的三大特性

封装

由来

比如拿 人类 来举例子,我们现实当中只存在一个一个的人(对象),人类只是一个概念性的东西,是我们人自己归纳总结出来的,我们知道人都长什么样,所以我们知道符合这个样子的就叫人,人的大脑总是习惯将事物分类,因此人类的概念就出现了,那么我们发现一个一个的人,都有眼睛鼻子嘴(属性),都能吃饭(方法),等等,这就是人这个事物的本质特性,然后我们得编程啊,人类的概念光在脑海中出现了还不行,还得体现到代码上?如何体现?
就要使用“封装”这个手段,也就是定义一个类,通过封装定义出来的这个类,和现实当中的人这个实体(对象)进行映照,从而应用到程序中。

定义

以类的封装来解释:
每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作,这就是对对象的封装。

作用

1、良好的封装能减少耦合
2、使类内部的实现可以自由地修改,而对外部没有影响
3、封装的类具有清晰的对外接口,方便与外界进行互通

继承

由来

技术来源于生活,生活中的父子关系,儿子具有父亲的相应外貌特征以及内在的遗传特征。

定义

对象的继承代表了一种 “ is - a ”的关系,如果两个对象 A 和 B,可以描述为 “ B 是 A”,则表明 B 可以继承 A。
比如:“猫是不如动物”,就说明了猫与哺乳动物之间继承与被继承的关系。

代码层面的作用

1、子类拥有父类非 private 的属性和功能;
2、子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;
3、子类还可以以自己的方式实现父类的功能(方法重写)

优劣点

优点:
1、继承使得所有子类公共的部分都放在了父类,使得代码得到了共享,这就避免了重复。
2、继承可使得修改或扩展继承而来的实现都较为容易。

缺点:
1、父类改变,则子类也不得不改变。继承时一种类与类之间强耦合的关系。
2、继承会破坏包装,父类实现细节暴露给了子类。

补充:当两个类之间具备“ is - a”的关系时,就可以考虑用继承了。

多态

由来

技术来源于生活,我们的国粹“京剧”以前都是子承父业,代代相传的艺术。假设有这样一对父子,父亲是比较有名的京剧艺术家,儿子长大成人,模仿父亲的戏也惟妙惟肖。有一天,父亲突然发高烧,上不了台表演,而票都早就卖出,退票显然会大大影响声誉。怎么办呢?优于京戏都需要化妆才可以上台,就决定让儿子代替父亲上台表演。
儿子代表父亲表演,化妆后就是以父亲的身份出现了。
儿子模仿得再好,那也是模仿,儿子只能用自己的理解表现方式去模仿父亲的作品。
儿子经过多年学习,有了自己的绝活与创作,但是代表父亲表演时,是不能够表现的。

特征

1、子类以父类的身份出现
2、子类在工作时以自己的方式来实现
3、子类以父类的身份出现时,子类特有的属性和方法不可以使用
4、不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行
5、当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用

方法的重写

来源于多态中,子类将父类实现替换为它自己的实现,这就是方法重写 Override。

抽象类

由来

技术来源于生活,猫,狗,猴子,鱼等的特征都可以从“动物”这个名词来进行概括,那么动物本身它是否存在呢?我们如何把它应用于程序呢?这时就产生了抽象类。

定义

抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的。

特点

1、抽象类不能实例化
2、抽象方法是必须被子类重写的方法
3、如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法

接口

由来

技术来源于生活,如何描述机器猫叮当,石猴孙悟空,猪八戒,蜘蛛人,蝙蝠侠等的共性呢?于是接口就产生了

特点

1、接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合,一旦实现了接口,类就可以支持接口所指定的所有属性和成员。
2、一个类可以支持多个接口,多个类也可以支持相同的接口。

接口 VS 抽象

表象来说

1、抽象类可以给出一些成员的实现,接口却不包含成员的实现
2、抽象类的抽象成员可以被子类部分实现,接口的成员需要实现类的完全实现
3、一个类只能继承一个抽象类,但可以实现多个接口

从形态上

1、类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象
2、如果行为跨越不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类

从设计角度上

1、抽象类是从子类中发现了公共的东西,泛化出父类(一般存在于重构)
2、接口根本不知道子类的存在,方法如何实现还不确认,预先定义
3、抽象类是自底而上抽象出来的,而接口则是自顶向下设计出来的

泛型

泛型的由来

我们在使用ArrayList集合装值类型数据时:
相对于简单的赋值而言,装箱和拆箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个全新的对象。
其次,拆箱所需的强制转换也需要进行大量的计算。装箱与拆箱时耗费资源和时间的。
更优的解决方案:泛型出现了

定义

泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。

泛型集合 VS 非泛型集合

通常情况下,都建议使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从 “基集合类型”派生并实现类型特定的成员。此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型,因为使用泛型时不必对元素进行装箱。

结语:
编程之路不易,且行且珍惜。

发布了222 篇原创文章 · 获赞 54 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/weixin_39966065/article/details/104052215