00:01
好了同学们,咱们接下来就接着往下看了啊,再往下的话,咱们看一下这个继承。啊,首先呢,我觉得是这样啊,我先给大家写一个例子,先给大家写一个例子,就是你觉得这个这个这个什么是继承对吧,有什么用。我们先讲明白这个问题啊,什么是继承?啊,有什么用是不是,哎,我们先来看一下啊,给大家举个例子,举个例子啊。举个例子来,这一块的话,咱们应该是新的章节了,各位啊,是第12章了,来点右键,我们新建一个chapter 1212好。那这块呢,咱们以什么为背景呢,去讲解这个东西呢。啊,其实这个东西啊,继承你想想也是对应的,我们现实生活,现实世界是不是啊,你比如说嗯,你比如说呃,咱们现实世界当中对吧,就有这种继承,什么继承啊,呃,比如说父亲很有钱,儿子不用努力,对吧?啊,他也会很有钱,是不是,那就是继承啊。
01:03
所以继承给你第一个感觉是什么感觉就是可以什么呀。哎,可以当富二代是不是,哎,就这意思啊,就什么是继承,继承在现实世界当中啊,也是存在的。例如,对吧,父亲很有钱,儿子不用努力。也很有钱。对吧,那就是这样的。那么我们在现实生活当中,我们现实世界当中,我们这个对象和对象嘛,父亲是个对象,对不对,儿子是个对象。那我们有继承,那么在我们程序当中,我们有没有继承的?哎,那当然是有继承的,这个是啊,在所难免的啊,是必须要有的,那么这个继承所对应的单词要注意啊,叫做extend extend extend extend啊这个单词要记住,那我们接下来来看一看,举一个例子啊,我们来看一下这个程序,呃,你来思考一下是吧,哎。
02:03
他这个继承啊,有什么用。零一。那假如说现在呢,我在这里啊,我定义一个什么呀,银行账户类。啊,那么银行账户都有什么呀。账户有什么属性啊,账户的属性,比如账号是不是简单给几个啊账号。除了账号之外还有什么呀,余额。对不对,哎,我们都给给一下啊,比如说我们这个public给public public不了class account账户是不是,那这个银行账户呢,我们有什么呀,有这个比如说private啊,我们写一个比如说类型的账号。是不是哎,叫cost number,然后呢,它有一个什么呀,Double类型的什么呀,叫做balance余额,那接下来呢,我给他提供构造方法,比如count提供一个什么呀,无参数的构造方法,然后呢,再提供一个什么呀?哎,有参数的构造方法也可以啊,没问题,给一个词砖类型的number,然后再给一个double类型的balance。
03:12
那么这边呢,我们就直接是。呃,this.account number是吧?哎,然后呢,等于account number,然后this点什么呀?Balance等于balance。好了,那我们的构造方法我们给了。构造方法我们给了,然后呢,属性我们私有化了,接下来set get方法提供上,是不是你比如说我们这块呢。嗯,提供一个方法叫set number是不是好,那么接下来是string类型的什么number啊,那this点。Account number等于account number是不是,然后呢,再返回一个词叫get account number啊,然后直接return谁呀account number啊好,那么接下来再来一个这个呢,叫set。
04:02
然后呢,Double balance是不是,然后这边是this点叫balance,余额等于balance,然后再来一个对吧,哎,这个呢,返回double叫get balance。好了。那么接下来return这个balance就可以了啊balance好了,那这个是标一下各位啊这几这个就是我们的属性,是不是这个呢?其实就是我们的构造方法,这些呢,其实就是我们的set方法和get方法,对吧,And get。对不对,好,那么来看这个就表示银行账户类,那么除了这个账户类之外呢,我们可能还有其他类型的啊,其他类型的账户。比如说信用卡账户,那信用卡账户呢,可能是比如说叫credit对吧,信用account,那么这个信用卡账户呢,它有什么样的属性呢?它可能会有这个账号属性。对吧,还有什么呀,叫做余额属性是不是可能它还有个什么叫信信誉度啊信誉度对吧,它可能有特殊的是不是,那么接下来呢,它这个属性啊,有什么呀啊有这个叫什么呀?叫这个呃,String的count number有账号吧,对吧?啊有这个double balance吧,是不是,哎,它还有啥呀?哎有这个double叫什么呀?叫credit是不是credit有信誉度啊信誉度这个呢,其实就是我们的属性了,对不对?再来往下我们提供构造方法,假如说构造方法,我们就提供一个呗。
05:32
就提供一个午餐的吧,得了啊。叫。Account啊,来这块提供一个无餐构造,再往下我们提供set and get方法吧,你想一想我们这块是不是,哎呀,这怎么没了呢?C and get方法吧,那你这三个属性应该提供六个方法,你除了上面这四个方法之外,大家想一想,我们是不是还需要在这里定义什么呀?此类特有啊,不是此类啊,要定义自己这个信用卡特有的方法,是不是你还需要再来一个什么呀,我们所谓的一个set方法和get方法。
06:18
那这个呢,我们叫credit,所以这块呢,我们应该还有两个方法叫什么呀,Public void set credit叫设置信誉度,那么这块呢,我们直接呢,来一个double啊,Credit,然后这边呢,我们是this.credit credit啊,然后呢,返回double啊,叫get credit来直接return这个credit就可以了啊,Credit可以了,这是它的set方法,这个是它的get方法啊,这是set get,然后set get好了,那么大家思考一下,现在我们的这个程序和我们的这个程序是不是显得有点臃肿啊。各位思考一下,思考一下啊,就代码是否臃肿了。
07:03
就代码是否臃肿了,你看我这个里边有两个属性。有三个属性,其中有两个属性和上面是怎么着重着的。对不对,哎,然后我这里有四个方法对吧,我这里有六个方法是不是,哎,我这六个方法里面,其中前四个方法和我上一个类的四个方法是不是一样的呀。对不对啊,哎,那怎么办呀。This。什么意思啊?当前这个代码没啥问题啊,你该调对象就对象对吧,该调方法调方法呗。是不是,哎,来分析以下程序啊。存在什么问题?
08:02
就是代码臃肿呗,对吧,代码没有得到什么呀,重复利用呗。对吧,重复的代码,重复教你有啥意义啊,你说你这堆有代码和这堆代码一样,你干啥呀,是不是啊,你这样写这这个语言这样这么去设计就很烂了啊来我们来看一下啊,这块呢,能不能正常用啊来account。New一个什么呀,Account啊,然后account set什么呀,这个account number呗,对不对,账号的话就随便写一个账号得了,点set balance呗,是不是啊,它的这个余额是多少啊,点是1万对,好,那system.out.out.print line打印我们输出act.get什么A是不是,哎,这是账号账号啊余额。余额是多少啊?那就是act get balance。
09:00
对不对,那下面再来一个account,这个account是什么呀?叫credit credit account对不对,叫CA等于new一个么呀,Credit account是不是完之后CA点什么呀?哎,我们account number呗,那账号是多少啊,比如说二二,然后呢,CA呢什么呀,Balance。Balance余额,余额是负1万呗,负1万啊,就是欠款1万呗,CA点什么呀,叫credit是不是信誉度,信誉度的话就是0.99呗,得了0.99信誉度啊,然后system.out print line打印输出print line打印我们输出输出什么呀?呃,这个ca.get account number account number啊这是账号对吧?然后呢,它的这个余额。对吧,是多少啊a.get什么呀?哎,不是act CA啊ca.ca.get balance是不是,然后再往下加一个逗号叫信誉度是不是,信誉度的话是多少啊?点get什么呀?Credit方法嘛,是不是。
10:09
子类有父类所有属性的方法,不过好像不能访问私有成员,嗯,抽取公共共性的内容出来啊好大家看这个程序啊,就是我现在上面这个创建的是普通账户呗,对吧,创建普通账户是不是下边是创建什么呀,信用账户啊,这叫创建信用账户。创建完之后呢,我们分别来编译并且运行来CD chapter cdcd chapter12好过去Java c形成Java编译,然后Java去运行,叫TEST01走。这个账户余额这么多,这个账户的余额是这么多是吧,信誉度是0.99,那没问题啊,这个程序很漂亮啊,很漂亮,但是这个程序啊,有一个问题就是代码臃肿啊是不是,那么怎么解决这个问题呢?哎,我们来看一看怎么解决啊,我把这个复制一下,各位贴过来,我把它改成什么呀,叫零二。
11:06
啊,改了之后呢,把它打开,打开之后呢,诶。使用继承来解决臃肿啊,来使用继承机制来解决代码复用问题啊,那么这块呢,我们可以怎么做呢?各位看好了,我们可以把就是你现在你这个程序里边是不是有一部分代码和这个里边是一样的,对吧,所以我就可以考虑把这个类呢叫做什么呀,负类。啊,我可以把它叫做父类啊,然后呢,我可以把这个类呢,作为一个子类,明白吗?可以作为一个子类,然后接下来你这个属性你不想写,你可以不写,你只写一个这个信誉度的属性构造方法这块不用动啊,然后接下来再往下塞盖方法,前四个你可以不用写对吧?好,那这样的话大家看是不是我这个类叫credit count,然后呢,这个类就代就变得很简洁,对不对,然后接下来在这加一个什么extend谁呀,哎,Account,那么extend这个单词表示关键字,各位啊,这是关键字,这个关键字表示继承的意思啊,表示继承的意。
12:14
那么这个是子类继承什么呀?父类子类继承父类,会将父类当中所有东西全部继承过来啊,记住我们这里是说的,注意啊,你不用看别的资料啊,就继承所有的东西,除什么呀,构造方法之外,剩下都是会继承过来的啊,都是会继承过来的啊,有的说私有的不能继承,其实私有是可以继承的啊,只不过在此类中是无法直接访问的。啊,是无法直接访问的,这个事要了解一下啊,使用继承来解决这个代码复用,你看继承之后这个程序能不能编译,能不能运行呢,来我们Java c呢,我们去编译一下,我们这个叫ten test02.java。好,大家看啊,他说这个是公共的,应该在这个名字里边声明啊,好了,我这失误了啊,这个名字得改成二,那改完二之后呢,和这个文件名保持一致,再来编一行。
13:05
好,大家看通过了,通过之后呢,我们加码运行我们刚才这个程序extend test02走,你看这个程序的运行效果和我们刚才那个程序的运行效果一模一样,对吧?哎,哪个地方进行了一个改进呢?就是在我们程序当中啊,我们这个类当中有一部分代码在这里已经出现过了,所以呢,我们把这个类当做一个父类,然后把这个类当做一个子类,子类去继承父,然后呢,子类继承父就是这么一个简单的关键字啊,就这么一个字,妥了,就把它东西拿过来了。对,你只要说一句话,就老子就会,就会给这个儿子钱,就这意思啊,就这意思,就说句话就行继承对吧,我继承你,诶妥了,你这个东西都得过来啊,就得过来放到我这里啊,表面看着只有这么一个属性,实际上我们这个credit count,它除了这个属性之外,还有这两个属性,那表面看只有两个ex set,一个get,对吧,其实它是有六个方法,因为上面这六个啊,上面这四个,哎,继承过来了,一共是六个方法啊,一共是六个方法,这此类啊,继承父类。
14:04
所以这个从代码上你看看着很爽啊,很简洁,你看Java c去编译啊,Java去运行。好了,那么这块呢,我们这是关于一个程序,一个一个讲解啊,什么是继承,有什么用,大家总结一下。有什么用啊,继承的作用有两个啊,基本作用和重要作用。或者主要作用啊,基本作用是啥。子类继承什么父类?继承父类啊啊,代码可以得到什么呀,复用代码复用啊,但是这个作用啊,是基本的,不是重要的啊,这个不是重要的作用,是基本作用啊,它的重要作用或者是主要作用是因为有了继承才有方法的覆盖和多态机制啊,重要作用是因为有了继承关系啊,才有了后期的方法覆盖和多肽机制。
15:18
这个是重点,各位啊,这是重点。明白吗?就是这里我们会讲方法的覆盖和多肽,看见了吗?这个第12章讲完之后,再往下是方法的覆盖和多肽。你没有继承,你就没有多肽,有的老师多肽是干什么的,这个后期我们会详细讲,而且这个是重中之重,我们的多肽呢,会将呃呃会什么呢?会贯穿你整个的一个Java生涯,你只要是做Java开发,多肽你需要天天使用,所以多肽是非常非常重要的,当我们把多肽讲的差不多之后,我们面向对象其实基本上也就结束了,各位。大家快熬出头了啊,封装继承和多肽,目前呢,这三大特性我们讲过,封装,刚才我们提了一下继承啊,然后呢以诶继承讲完之后我们会讲一讲方法的覆盖多态机制,那这样基本的大家也就熬出来了,再往后呢,就会很简单很简单啊很简单,坚持一下啊坚持一下。
16:14
好了,嗯,那么这块呢,我们再接着往下看啊。那么这个继承这块啊,需要有这么几个注意事项啊,我从这个文档里面拿一下各位啊。继承。呃,如何继承语法很简单啊,就是采用extend啊,然后呢,继承的相关特性有这么几个特性,各位我从这拿一下啊。拿一下放到我的文档当中。拿过来。放到这个地方啊,继承的相关特性。哎哟,这个符号能复制过来是吧?能保存吗?可以保存。有些概念性的问题,我需要给大家说一说,讲一讲啊。
17:01
来,我们先看第一个。B类呢,去继承A类各位。啊,谁称这个A,称为什么?就比如说呀,现在呀,你在这儿有一个什么呀,Class a类,然后呢,你在这儿又写了一个class b去继承A,那么我们把这个A叫做什么呢?注意啊,叫做负类积累或者是超类英语单词叫super class。Super class啊,那这个B类呢,它就是孩子,那B类则称为什么呢?称为子类s class啊,还有派生以及扩展类啊,其实我们啊平时聊天说的最多就是负类和子类啊,我们平时聊天说的比较多的是负类。啊。和子类各位啊,父类和子类,但是如果说你在公司里边,呃,写代码的时候突然之间对吧,哎。有一个同事说呀,积累。
18:01
基本的鸡啊鸡类,那你要知道他说的是类啊。然后超类是super class,所以A类呢,这个父亲啊,他可以叫父类,也可以叫鸡类也可以叫。超累啊,Super class这个鸡肋不是你说的这个鸡肋啊,你这个鸡肋是食之无味,弃之可惜啊,咱们这个鸡肋是基本的积啊,基本的积来,那么咱们再往下看一看这些概念,我觉得大家要注意啊,尤其这个单词你得有点印象啊。Super class和class,一个是父类啊,一个是子类,这是对应的英语单词,你在一些帮助文档当中见的最多就是这些单词了啊,来,我们来看第二条。第二条是什么呢?第二条是Java中的继承,只支持单继承,不支持多继承,C加加中啊支持多重继承。
19:01
这也是Java体现简单性的一点,换句话说,Java中不允许这样写代码,注意啊。不允许这样写,没有这种语法,说B呢,去继承A和C。这是错误的啊,这是错误的来,那么这块呢,咱们可以给大家说一说啊,来extend。零三那么这块呢,咱们来看看这个继承啊,比如说我们写class a,然后呢,Class在这加一个B,然后class c class c干啥去继承,然后呢,Class,嗯。继什么呢,去继然。算了,先这么着吧,好吧,先这么着啊,看编译能不能通过行不行,来Java c test03.java。
20:04
没问题,各位没问题啊,没问题,你看AB是吧,去继承ad,去继承B,那能不能说来一个class去继承A和B呢?A,然后逗号B,允许不允许这样去写在我们中,不允啊来。好了,他说第17行这个位置有问题。是不是哎有问题,所以这个是语法错误的啊,语法错误,语法错误两个父亲不行,我说一下啊,C加加里边允许的啊,C加加当中允许的,什么叫两个父亲,你比如说我吧,我呢,应该是继承了我父我父亲的这个特点,我又同时又继承了我母亲的特点,在现实生活当中难道没有吗?你的你的身上的基因是不是应该有你父亲的一部分,应该有你母亲的一部分,对吧?所以说人家C加加设计的是合理的啊,C加加设计的多继承是合理的。
21:02
对C加加十这个。C加加Java不允许,Java只允许单继承,Java只允许单继承。不允许多继,Java是简单的C加加,支持多重继承。啊,那C加加更接近现实啊,C加加,其实C加加更接近现实一些啊,因为在现实世界中对吧,儿子同时继承什么呀?哎,父母两方特征啊,两方特征多继承啊,多继承,那么Java语言中允许不允许这个呢?Class X,然后来一个Y,然后呢,Class y去继承我们的X,然后class z呢去继承Y,好,各位,我问大家这个是不是也说明了我们的Z是继承XY的?
22:05
其实这也说明了X啊,说明了Z是继承什么呀,X和Y的,你想想是不是这样的?你有一个X,你Y不是继承了X吗?那我Z再去继承Y,那不就相当于Z我把X和Y都继承过来了吗?一个干妈,一个亲妈。好,大家现在思考一下啊,那这个X有个Y不是继承了X嘛,你现在Z不是继承Y嘛,是吧,所以Z呢,其实直接继承Y,它间接继承X啊,注意我们这样说这样描述啊,就这样描述就是Z啊继承了谁Y。啊,或者直接Z直接继承了Y啊Z间接继承了什么,不是简介啊,是间接间接继承了。XZ啊,间接继承了X。
23:05
呃,Class a class b,继。那没问题啊,那没问题啊,你class y呢,你再来个class m对吧,Class m,你M也去继承这个X行不行,那没问题啊,你X这块你是吧,我Y去继承,你M再去继承你没问题啊,没有任何问题啊。那X岂不是Z的爷爷?X岂是岂不是Z的爷?你可以这样去理解。可以这样去理解啊。这都允许编译一下没问题啊,你看可以是不是,哎,X可以同时被这个继承,然后这个呢,也可以去继承X啊,然后你Z呢,可以继承Y,你Z如果继承Y的话,其实就相当于Z把ZZ直接继承Y,但间接继承X嘛。啊,天天几成X。嗯。好了,那么这块呢,咱们就探讨到这儿啊,探讨这这是第二点啊,这是第二点,然后第三点是虽然Java中不支持多继承,但是有的时候会能能够产生间接继承的结果,对吧?哎,例如呢,C呢去继承什么呀?B,然后B呢去继承A,也就是说呢,C直接继承B,其实C还间接继承了A,这个其实就是刚才我所说的C呢去继承BB呢去继承A,实际上是C直接继承B,但C还是间接继承了AA是爷爷。
24:26
是孙子啊,就这意思。啊。好,那么这一块是这样啊,这块Java中规定子类继承父类,除构造方法这个去掉,各位啊,这个去掉这有点问题啊。除构造方法之外,除构造方法不能继承之外。剩下的都可以集成啊,都可以集成,但是但是私有的属性无法在子类中,无法在子类中直接访问。
25:12
啊。继承18次。哎呀,我的天呐,能继承到人类诞生,万一我非要继承那两个类特点呢?万一我非要继承那两个类的特点,你非要继承,那你就那你就那什么呗,你你你你你写一个类继承它对吧,然后你再写一个程序间接继承呗,不也行嘛,对不对,哎,或者说你用后期的接口不也行吗?后期咱们有接口概念啊,是可以实现多多继承这种这种思想的啊。好,那么这个继承相关特性继续说啊,首先第一个呢,我们要知道啊,这个继承这块啊,使用的一个关键字啊,大家各位要记住叫extend a关键字啊,关键字这是新的,从来没有讲过,这是第一次啊,那这块呢,说的我们一些术语是不是有一些什么父类呀,鸡类呀,超类呀,子类呀,派生啊,扩展呀,是不是单词super class double,不允间接允B,直接C接C是孙子啊就这意思,加法中规定规定啊,你记住子类继承父类除构造方法不能继承之外,剩下都可以继承,但是私有的属性无法在子类中直接访问,各位啊,Private修饰的不能在子类中直接访问,就是负类中private修饰的。
26:33
不能在子类中直接访问。啊,不能直接访问。啊,可以通过什么呀,间接的手段来访问,可以通过间接的手段来反问,到底怎么访问,到时候咱们再说。啊,到时候再说啊。其实我们的程序其实也说明这一点了,各位,我不知道大家有没有看明白啊,就说我们现在呢,这个账户account,然后此类是credit account继承account是吧,那么我们子类去继承父类之后呢,我们在这块怎么着呢?除了调这两个方法之外,我问大家我们能不能去调用这个方法。
27:13
去给这个属性赋值,我们是能不能去调set balance这个方法给我们的余额进行修改啊。可以啊,你看CA在这里可以除了调这个信誉度之外,它还可以调两个S的方法,而你这个S的方法和这个S的方法是不是这个值和这个值就会付给你负类的这个和这个属性啊。是不是,哎,所以你这块没有办法直接访问,什么意思,就是说你不能这样CA点什么呀。Account number不能这样做。原因是它是私有的,你子类继承父类之后。你在这里也没有办法访问,明白吧,你在这里也没有办法说你写一个方法对吧?啊,你说do some这个方法,你说你在这system.out.la.out.land这不子类吗,子类吗,是不是继承父类呀。
28:03
那这个account number在这能不能直接访问啊。能不能在这访问啊?子类说继承父类私有的东西,但是能不能访问?来我们编译一下,报错了啊。啊,不是这个啊,不是这个二,各位二啊。第64行说在A在account中啊,是private访问控制的。就是你这个第64行在这儿,这一行代码是不允许的,不允许的,但是呢,你要想访问,实际上是可以访问,怎么访问,通过间接访问对吧?哎,间接访问是可以的,你可以这样做呀,对不对,叫get什么呀。你不是读吗?对吧,叫get act number这个方法呗,是不是,哎,严格意义上来说,你的子类继承类是不是会把这个get number这个方法拿过来,而这个方法在我此类中能不能直接访问啊,可以呀,对吧?哎,This点或者说哎你在这块呢,This点可以怎么着啊,省略呀,是不是。
29:03
哎,省略啊省略,那么这个时候我们再去编译这个程序,你看就没问题了,对不对,但如果说你直接在这访问,那就不行。啊,就是这里我强调一下啊,就是这里有个点什么点呀,规定啊,构造方法不能继承。构造方法不能继承,剩下都行。我说了很多遍啊,剩下都行,Private不能直接访问,但可以通过间接的手段来访问啊。
我来说两句