00:00
那项目二呢,做完以后呢,咱们接着呢就来看一下这个第五章,第五章呢,仍然是我们面向对象的内容,咱们面向对象呢有三条主线,咱们接着呢去推进这三条主线,那么第二条主线呢,叫面向对象的三大特征,我们在第五章中,第五章当中继承性和多态性这呢就都讲完了,就是关于这个,呃,第二条这个主线叫面向对象的三大特征呢,我们这一章呢就都搞定了啊,那除此之外呢,第一条主线还剩一个代码块和内部类,这个放到第六章中去讲,然后这张呢,我们关键字再提几个,嗯,有了这个继承以后呢,这个protect it呢,我们就可以稍微给大家演示一下,测试一下了,哎,这是权限修饰符这块,然后呢,这个关键字呢,叫做super,哎,这块呢,也提一下,这是我们这个第三条主线,哎,相当于关键字这块的情况啊,然后这一章呢,还提两个类。
01:00
或者叫两类类啊,第一个类呢,叫做object类,然后另外一个呢,叫做包装类,对其实这两个结构的话呢,严格上来讲,可以不把它归到面向对象里,就是类的使用啊,那只是说呢,我们讲完继承这个,包括这个多肽以后,子类对象实例化以后呢,诶我们这儿呢,相当于是额外的给大家又补充了两个常用类的使用啊,常类的使用诶是这个原因啊,核心的来讲呢,是这六个算是咱们面向对象里的内容。啊是这个意思,好,那我们呢,就首先呢来看一看继承性的一个使用啊,继承性的话呢,也不是特别复杂,相对来讲大家也比较容易去理解啊好,那我们来看一下这个叫继承性啊,这块呢,咱们仍然是回归到这个代码层面啊,通过咱们之前写代码的情况,我们来引入这个问题,行,那这块的话呢,我们就直接呢来写了,我这呢先创建一个类叫做person类。
02:01
啊,P类里边呢,我们去声明相关的一些属性,暂时呢,我先不考虑这个封装的啊,就是我就先只用这个默认的这种权限来去修饰了,那int型的一个age,好,然后呢,你可以去提供它的这个构造器啊,这是一个无参的提供一个代餐的。行,然后呢,我们也可以提供简单的两个方法,哎,我啊人这个叫吃这个我就写个叫吃饭了啊,然后接着呢,我们再来一个public来一个。这个地方叫睡觉行,那我们暂时的话呢,这个类就写成这样啊,大家呢,应该都比较熟悉了啊,属性构造器方法,然后现在的话呢,我们在这个项目当中啊,使用的时候呢,发现还得定义另外一个类,这个类呢,比如说我这就写成叫student了,哎,叫做学生类啊,这个学生类呢,在定义的时候呢,发现呢,我们也得去声明这样的一些属性,String型的name int型的age,同时呢,多了一个就是磁针型的学生呢,他有一个具体的专业了,叫major,下边呢也提供他相应的一些构造器。
03:30
先是一个空餐的,然后我们再提供这个代餐的。这个就是专业的意思啊,这点。诶,Name age age major major好,构造器呢,我也就写这两个方法的话呢,你会发现呢,诶说我这个项目中要写的话呢,这个student呢,也有这两个方法,我这呢就直接CTRLC了一下,同时呢,这个学生呢还多一个比如叫学习的方法。
04:18
这呢,我们写一个学习的学习。就这样就可以了,好,那么目前的话呢,我们这两个类呢,就造好了,我这呢举的是一个person和student啊,相对来讲比较形象一点,那真正开发当中呢,可能不是这两个,比如说它可以是呃,像类似于person的话呢,它可能是一个叫账户。我们昨天也写这个练习了,叫账户,然后这个student呢,你可以类似呢,理解成比如说叫这个check account check account,嗯,或者你理解成它就是一个叫信用卡账户,然后还有呢,像这个比较saving account就是储蓄账户,你会发现呢,我定义的这个叫就是一个普通的账户,这个呢是特别具体的这种信用卡账户啊,储蓄账,储蓄卡账户啊等等,那么它里边呢,总会有一些属性啊或方法呀,你发现他们都定义过。
05:15
都是一样的,比如说普通的账户里边就会有余额,你会有存钱取钱的方法,那么我们这个,呃,这个信用卡账户或者是储蓄卡账户,它也会有余额,也会有存钱取钱的方法,而且呢,存钱取钱目前来看基本上没什么区别,就是你这个要取的钱余额,呃,取的钱这个余额够那就减,不够就不让减,存钱呢就往里加,就这样一些功能,就是目前来看呢,也都比较相似。就是实际开发中可能是这个样子的啊,我这呢,就是稍微形象点,拿这个person和student来举例子呢,好,写完以后的话呢,我们来一个测试在这里写,或者这个测试的这个名字呢,我稍微改一下,我改成这个叫咱们现在说的是这个继承,涉及到了一个关键字叫做extend。
06:07
我这就用它来写了,大家一看这个名能知道这是关于继承相关的行,那这块呢,我们先来写一个main方法,Main方法这块的话呢,我们比如说要创建一个person,那我就直接去new一个person就可以了。这样你有一个person,然后这个PE你可以去调它的这个,嗯age去做一些赋值也可以呢,调它的相关的方法,调一些it方法,这是student person啊然后呢,这个student呢,我们也可以去创建一个具体的学生。让这个一呢,咱们也可以调它的it,调它的属性,或者调它的其他的方法,这个都是可以的。啊,这块测试呢,这个应该也都比较简单了。哎,都是OK的,行,哎就是这样个情况啊,目前的话呢,我们看到的是person类和student类这两个类,你说有这个关系吗?目前就从我们这个代码层面,没有这俩一点关系都没有,对吧,就是没有任何是任何的关于我们这个类的关系的一个情况,那类跟类之间到底都有什么关系,插入一句,那这个大家下来呢,你可以先看一看我们这提供的一个文档,感兴趣的话呢,你可以做一个拓展知识看一看,目前的话呢,我们这两个类之间没有任何关系,但是呢,我们说这个person跟student,我们发现的一点就是student里边定义了一些功能,在person里边呢也定义过。
07:45
属性和方法都存在这种情况,如果你要是画一个集合这种图的话呢,就发现这如果要是person类的话呢,呃,这块这个是这个student类,你发现它们里边有些共性的这块呢,你可以理解成好像就除了构造器这个student定义的这个person里边都定义过了啊说反了,Person里边定义过的,在Su里边呢,都定义过了。
08:08
你要除去这个构造器的话呢,似乎说person里边定义了两个属性,两个方法,然后我们student是不是都定义过,好像有点像这样的一个关系了,那我们就现在就想说的是,既然person这个类里边已经定义过了,然后呢,我们这个student呢,是新定义的一个类,这个类的话呢,就想说能不能复用一下已经定义好的这个结构。这样咱们再定义的话呢,是不是就可以简单很多呀。嗯,这就是我们现在的一种想法,那如何能够实现,说咱们定一个student,不用说再从头一点一点的一行一行代码去写了呢,哎,我们呢,对,就可以使用这种继承的关系。其实就跟人呢,稍微有点像,所以这个单词呢,这个翻译成中文呢,咱们就要继承了,还是挺形象的。
09:02
就像大家这个,比如说你如果是这个没有你的这个长辈任何人了哈,你就是一个完全白手起家的,什么也没有,那你就相当于是这个叫叫什么叫一代是吧,差一代什么的,一代是吧?哎,你第一代人你什么也没有,那就是白手起家的,但如果你要想一出生你就发现想有点东西,省着你自己一点点去造了,你是不是就得继承啊,从你爸这从哪的或干爹这的啥的是吧?哎,就得继承点东西,这样的话呢,你才能一下子有,省得你自己一点点去创建了啊咱们这也是一样,说我这个student创建的时候,能不能不用这种一点点去定义了呢?这呢你就得去继承了,Person呢,它是一行一行的写的,写了这样一些结构,然后到你这儿的话呢,诶,你直接呢CE一下,我呢后边呢写一个person,那么这样的话呢,Person里边定义的那些结构。
10:03
你这就有了。有了,那就意味着person中呢,我们定义过name和age这块呢,就不用写了。这个major呢,没定义过,那你可以写,就是你从你爸那继承过来的东西,你要有些东西觉得不满意,是不是还可以自己再去新创建啊,对,就是这样啊,那么这块呢,构造器咱们说跟这个类重名呢,这也不能删,这两个方法呢,是不是在父类中也定义过,所以我就也注释掉了,好然后这块呢,诶是你自己独有的,我们也先保留着。这呢就是咱们所谓的叫继承性,当我们把这些删除以后,大家回到我们这个测试层面,你看一下,你看是不是并没有报错。而且我们去执行呢,也仍然是正确的。啊,包括呢,你看我这个S1,我呢去调这个name,它竟然也还是可以调的。
11:00
也是没有问题,按说呢,你这个内幕呢,在我们这个死牛顿的类当中并没有定义过,但谁让你继承了呢,继承了就有对吧,就像这个王思聪一样,现在呢,就天天玩就行啊,那谁让这个他生在这个。王氏家族呢是吧,哎,出生就含着这个金钥匙,那实际上人家有个金钥匙呢,对吧?哎,所以说呢,就是因为他继承了,如果我们把这个继承这个代码给他干掉,那你这块呢,又什么也没有了,你在这块呢,自然而然的他就报错了。说你这个E的方法没定义过啊,Sleep没定义过,内幕没定义过,就跟说王思聪呢,一看说这个老王不是他亲生爸就啥也没有了是吧?嗯,这就属于这种关系一样啊,但现在呢,我们加上了,一加上呢,就真的是这个继承的关系了啊,那这个父类当中有的它就都有了,这个保存一下。哎,那这个时候呢,它就不报错了,这呢就是咱们所说的这个继承的一种代码上的体现啊,代码上的体现,那我们回过来看一下啊,我这儿呢,就画了一个图。
12:14
画了一个图,咱们刚才呢,是拿这个叫person和这个student来举例子的,那实际上的话呢,在开发当中,诶,我们还可以定义很多丰富的类,那一个项目当中,就像刚才那会儿说啊,一个叫account,有这个具体的话呢,有这个储蓄卡的账户啊,信用卡的账户啊,还有什么黑卡呀,金卡呀,各种卡很丰富,就像我们这个P呢,你会干,你会见到有这个客户类,这个比如服务员类,老师类等等各种各样的类,当我们定义好一个类呢,叫做person类的时候,里边呢定义了一些功能,这些功能呢,发现在我们的这个,呃,Customer student wait或者teacher当中都会定义这些结构。
13:00
那这时候我们说就不用自己一行行去写了,我们呢,就直接呢,通过这种继承的方式,让这两个类之间呢发生关系。正常的关系啊,发生我们这个代码层面这种关系啊,这种关系呢,叫做继承的关系啊,是子父类的关系啊,这个有了这样的关系以后,在我们负类当中定义的这些结构,此类呢,就直接就有了,直接就有了,然后呢,你这是个student,诶你这一继承它也就有了这个WAIT1继承,这里边儿你可能一行代码都没写过,但是呢,你继承了,一继承它也就有了,这个也类似。那有了以后呢,你照你自己的对象,你就可以去调这里边有的这些结构了啊,就是这样一个方式者,你换一个角度理解也行,什么意思呢?原来呢,我们只有这四个类,换一个角度去说啊,原来呢只有这四个类,这四个类呢,你会发现它们都定义过一些功能相同或者相似的代码,一些属性啊,一些方法等等,那么你每个类都这样去定义,可能还不止这四个,我们就想这呢,都这样去写,好像有点重复,有点啰嗦了,或者叫冗余了,说呢,我们能不能把这相同类似的这些功能呢抽取出来。
14:23
那我们就抽到这里了,抽到这里以后呢,我们通过这种继承的关系,直接呢,就拿到这里边儿这个功能了,原来呢,你需要写四份。现在呢,你抽取出来以后呢,就只需要写一份就行,那把抽取来的,抽取出来这个代码呢,也得放到一个类当中,这个类的话呢,我们就称作他们这四个类的父类,这有了继承以后呢,这就是他的父亲,这就是他的儿子,你不能白继承,你得认人家当父亲是吧?嗯,只有从父类这块才可以去继承。那我们抽取出来以后,造成一个类,那这个类的话呢,就相当于是它们的一个共性一样,那我们这个类名呢,就叫做person类啊,就是个人类啊,就这样子的。
15:10
然后现在呢,马上又来了一个dog狗一看,诶,我也有些功能是类似的,能不能提成啊,这是绝对不行的,就是虽然说呢,继承这个事儿很好啊,就一继承就都拿过来,但是你也得符合这个伦理是吧,那在代码层面呢,你也符合这个规则,不能看着人家好,你就继承你这个狗的话,你想继承你自己造个animal,你去继承animal去,不要往这继承是吧?哎,所以说呢,不能为了继承而继承,不能说A继承这个事很好,然后谁都继承哪个都当父亲当爹是吧,你不管是谁就就都行是吧,那不可以。啊,说的夸张点,你看这个狗跑的挺快,你也想具备这种功能,这是不可以的啊,得符合这个实际的规则才行啊行这呢就是咱们把这个事儿呢描述了一下,那么回过来这个继承有什么好处?
16:05
想一想面向对象的特征之二叫继承性好,那第一个问题,呃呃,这大家就去掉了,通过刚才这个代码,包括咱们这个图上,图上的这个语言的描述哈,咱们呢,去总结一下说叫继承性的好处,想想什么好处啊,是不是一下子我们那个代码量就少很多了呀,哎,我们可以理解为叫减少了代码的冗余,减少了代码冗余相当于呢,就是提高了代码的这个复用性。这个呢是我们非常直接的一种体验,就是原来呢你写四份,现在写一份就行了,那那写一份的话呢,谁想掉都可以掉,那这个复用性相当于就变好了,还有没有别的好处。
17:13
别的好处你想想啊,那我们这个person里边呢,比如说现在呢,有两个功能,回头呢说诶这个人呢,好像不止这两个功能,这些呢也需要扩展功能,原来你要是想扩展的话呢,你是不是得在这四个里边,比如说想加俩功能,这个加一下,这也得加一下,都得加。现在的话呢,我是不是只需要在父类中加一份,他们又有继承关系,直接就有了,这就相当于是,呃,对于我们这个代码功能的一个拓展的话呢,就是更加的便利了,哎,便于功能的扩展,把这些此类呢都具有的,这些都都想扩展的功能直接生命在父类当中,子类呢,又因为继承了直接就拿到啊这就这样,其实主要的话呢,就是这两个点,另外这个三的话呢,是为了我们后边这样一个准备,就是为之后的这个多态性提供了前提的使用,提供了这个前提,也就是说呢,我们后边讲多态性,它的一个使用前提就是得先有这个继承性,后边呢我们再讲,所以大家呢,先把这我我们这里讲到这个继成型的好处呢,哎,大家呢,诶,实打实的都能,实打实的都能体会一下啊,这是这两个好处。
我来说两句