面向对象程序设计——Java语言 2

继承与多态

面向对象程序设计语言有三大特性:封装、继承和多态性。继承是面向对象语言的重要特征之一,没有继承的语言只能被称作“使用对象的语言”。继承是非常简单而强大的设计思想,它提供了我们代码重用和程序组织的有力工具。

类是规则,用来制造对象的规则。我们不断地定义类,用定义的类制造一些对象。类定义了对象的属性和行为,就像图纸决定了房子要盖成什么样子。

一张图纸可以盖很多房子,它们都是相同的房子,但是坐落在不同的地方,会有不同的人住在里面。假如现在我们想盖一座新房子,和以前盖的房子很相似,但是稍微有点不同。任何一个建筑师都会拿以前盖的房子的图纸来,稍加修改,成为一张新图纸,然后盖这座新房子。所以一旦我们有了一张设计良好的图纸,我们就可以基于这张图纸设计出很多相似但不完全相同的房子的图纸来。

基于已有的设计创造新的设计,就是面向对象程序设计中的继承。在继承中,新的类不是凭空产生的,而是基于一个已经存在的类而定义出来的。通过继承,新的类自动获得了基础类中所有的成员,包括成员变量和方法,包括各种访问属性的成员,无论是public还是private。当然,在这之后,程序员还可以加入自己的新的成员,包括变量和方法。显然,通过继承来定义新的类,远比从头开始写一个新的类要简单快捷和方便。继承是支持代码重用的重要手段之一。

类这个词有分类的意思,具有相似特性的东西可以归为一类。比如所有的鸟都有一些共同的特性:有翅膀、下蛋等等。鸟的一个子类,比如鸡,具有鸟的所有的特性,同时又有它自己的特性,比如飞不太高等等;而另外一种鸟类,比如鸵鸟,同样也具有鸟类的全部特性,但是又有它自己的明显不同于鸡的特性。

如果我们用程序设计的语言来描述这个鸡和鸵鸟的关系问题,首先有一个类叫做“鸟”,它具有一些成员变量和方法,从而阐述了鸟所应该具有的特征和行为。然后一个“鸡”类可以从这个“鸟”类派生出来,它同样也具有“鸟”类所有的成员变量和方法,然后再加上自己特有的成员变量和方法。无论是从“鸟”那里继承来的变量和方法,还是它自己加上的,都是它的变量和方法。

4.1 继承

 

 

先做一个Database类。

private ArrayList<CD> listCD = new ArrayList<CD>();

提示错误,点黄色小灯泡,提示:Create class’CD’      

有了CD的类,如何把这些东西初始化起来呢?先把这些成员变量做好以后,在eclipse里边,Source菜单里边Generate Constructor using Fields.. 用这些所有的字段来帮我们建一个构造器,这个构造函数需要这么多的参数,然后帮我们把所有的这些成员变量都初始化好了。gotIt可以不打勾,给一个默认值就行。

Database这边需要有一个add函数。还需要一个函数,列出所有的cd。

程序执行结果:

在这里边放的是我们自定义的一个类CD。

我们想扩充一下这个database,我们想往里面放另外一种东西,比如说那种叫做DVD的。

我们想在里面放DVD,怎么做呢?

我们得要有另外的一个类,那个类是表达DVD的,然后我们把这个DVD的东西也放到这里边,让这个资料库也能够管理这个DVD,那我们来试试看是不是可以这样子。

我们得另外有一个用来放DVD的那么一个Arraylist。我们把它叫做ArrayList<DVD>()。

    private ArrayList<DVD> listDVD = new ArrayList<DVD>();

报错信息显示没有DVD,那创建一个吧。

 

于是我们又有了一个 DVD,然后DVD里有什么呢?其实DVD和cd也蛮像的,那我们不妨从cd这里借一些东西。

往这个database里面加DVD的话,就还得有另外一个函数叫做add,然后呢它接收的是DVD,这叫做函数的重载,有两个函数,它们的名称是一样的,但是它们的参数表是不一样的,这是重载。

 

这个database。 它里面有两个容器,一个容器放CD,一个容器放DVD,当然这个成员变量其实是一个管理者,所以是外面有一个容器,那个容器里面呢,放了很多管理着很多cd的东西,然后呢,另外那个容器里面呢,又管理着很多DVD的东西,所以现在其实大概是这种结构。

 

这样的代码,功能是可以的,做到了我们要的那个功能,能够保存cd的,能够保存DVD的,能够都列出来,但是这个代码是有问题,那么这样的一个资料库程序有什么问题呢?

很多地方都一模一样。不一样的仅仅只是一个是CD,一个是DVD,而cd和DVD本身又有很多相似的地方,我们看到在这里面出现了大量的代码复制,回想我们刚才把这些东西做出来的过程,就是拷贝粘贴,然后稍微修改一下,在代码当中出现这样的代码复制是代码质量不良的一种表现,因为有了这样的代码复制之后,就意味着将来我们要去维护这样的代码是不容易的,如果我们发现print做的不好,希望改改print,那我们所有的print都要改,而且这样的代码不具有可扩展性,如果我们要增加一种新的类型,比如说我们要增加一种这个MP3的这个U盘,然后我们就得为它做一个新的类。然后我们就要在这个database里面为它增加新的add函数。为它增加新的Arraylist,为它在list函数里面增加一段新的循环,我们要做很多工作。

怎么来改进这件事情呢?我们看到在我们的代码里面,CD和DVD很相似,我们能不能从这两个类里头提取一些东西,来做一个公共的东西,这个公共的东西可以表达CD或者DVD。然后我们让database管那个公共的东西,而不是管这里的cd或者DVD。

我们先来试试看,做这样的事情,说我们在这个里头呢,有一个新的class,我们把它叫做Item。然后呢,我们说CD是一种特殊的Item,extends Item。

说我们的DVD呢,它也是extends Item。

我们做了一个新的类,叫做item,在这个类里面什么东西都没有,我们定义了一个空的叫做print的函数,然后其他什么都没有了,然后cd呢,跟原来不一样的地方是我们加了extends Item,我们说这个CD类它扩展了Item,这是一个英文单词叫做extend,意思是扩展完了以后呢,我们还得加上s,class CD extends Item 是一个陈述句,第三人称单数,动词要加s。

做完这个之后这个CD就成为Item的一个子类,这就叫做继承。

有了一个Item类了,然后这个CD是Item的一个子类,同样的DVD也是 class DVD extends Item,他是Item那个类的一个子类。

这4个类的关系,有一个类是Item,从这个Item派生出来两个子类,一个叫做CD,一个叫做DVD,它们都是Item的子类。那个Database只认识叫做Item的类,在database里面有一个数据结构Arraylist,那个Arraylist是放Item的。所以这4个类成为这样的一个关系,Database没有直接和CD,DVD打交道。Database是管那个Item的,他里边有一个放Item的容器,他的list函数会去遍历那个Item,他的add函数会把东西往Item里边加。

也就是说什么呢,我们的父类定义了这么一个函数之后,在cd这个子类当中,它天然的就继承得到了那东西。所以,继承得到什么?父类有什么,他就得

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值