00:00
行了,那么接下来呢,咱们就来看一看,我们这个再往下啊,我们还要把这个抽象类这一块干什么呢?我们可以给他好好的看一看啊,好好看一下还有哪些知识点是不是好继续啊,我这样吧,我就不在这个文件里边改来改去了啊。再改来改去,你也感觉就是迷糊是吧,哎,迷糊了,那我再重新建一个文件。我叫abstract test02。嗯。来。当然这块呢,还是说一下这个抽象类啊。Public class我们叫。Strict test02。Public static avoid。那比如说啊,我们现在呢,在这儿呢,有一个class,这个class叫animal啊动物类。
01:07
然后接下来我们呢,这个假如说定义成抽象类abstract抽象类呢当中呢,我定义一个什么呀,抽象方法。那么这个抽象方法呢?我这样定义,Public void move。好,动物类啊,是一个抽象类,那假如说现在我写一个子类,各位啊,大家看子类,这个子类呢,我先定义成非抽象的。啊,那么class,我叫做bird鸟儿,鸟儿干什么呀?去继承谁呀?哎,继承这个animal,那么大家现在思考一下我们这个程序啊,它会不会有问题。就是我们这样的程序有没有问题,你得找出理由啊,Abstract加上这个啊抽象方法,哎,对对对对,没写啊,这个没写加上去这抽象方法是不是,哎,然后呢,这是子类呢,去继承负类,大家思考一下这个有什么问题?
02:18
其实我已经给出答案了啊,你看这句话。你根据这句话啊。来判定一下这会出什么问题,就这个程序会出什么问题。说抽象类中不一定有抽象方法。我同意抽象方法必须出现在抽象类中。抽象方法必须出现在抽象类里边。好,子类,大家想一想,是不是会继承父类啊?子类继承父类,会不会把这段代码继承过来?他一定会把这段代码继承过来。那么继承过来之后,大家想他这个方法是不是抽象方法,那么这个类是不是必须得是抽象类。
03:01
所以大家想,这里会不会有问题呢?那肯定会有问题,对吧,我动物这个类,你你你分析一下啊,这个程序啊,它这个设计呢,其实都是有说法的啊,不是一定要重载,跟重载没关系啊,重载是发生在一个类里边,你明显都产生父子类继承了,怎么叫重载啊是不是哎跟承重载没有半毛钱关系啊来我再说一下各位啊,大家看。我分析一下分析一下啊,负类是抽象类对吧。就是我们分析一下各位啊,你看我是怎么一步步分析的,咱们最好不要去死记,就是死记硬背对吧,你讲道理是不是对吧,不要死记硬背啊,死记硬背。有一些啊,有些内容不要死记硬背啊,讲讲道理。明白吗?哎,那么首先分析animal是负类,并且是抽象的。
04:11
对吧,Animal这个抽象类中有一个抽象方法。子类是谁啊?是bird bird是子类,并且不是抽象的。并且是非抽象的。一个是抽象的,一个是非抽象的啊,那过。继承animal之后,会将什么抽象方法继承过来?对吧。抽象方法继承过来,也就是这个里边是有这个代码的。
05:01
那么大家思考一下,矛盾不矛盾?抽象方法是不是只能出现在抽象类里边?那你这个B类它不是抽象的呀。所以这就矛盾了。抽象方法必须出现在抽象类当中。好。各位。是不是必须把这个方法重写一下呢?对吧,需要将什么呀,从父类中继承过来的抽象方法进行覆盖。或者叫重写。或者也可以叫做实现。就是把抽象的东西给它实现了,把抽象的内,把抽象的方法实现了。
06:05
假如说你不写这个,你编译一下,他报不报错,你子类继承父类会把这个方法继承过来,而你这个方法就是抽象方法,反过来说,抽象方法必须出现在抽象类里边,而你这个类又不是抽象类。你不是抽象类,那能行吗?对吧,所以说就产生了矛盾嘛,我再说一下,你子类继承父类,父类里边有一个抽象方法,你把抽象方法继承过来了,你想一想,而我们说了抽象方法必须出现抽象类里边,而你这个类不是抽象类,所以这个肯定是不行的,那它到底会报什么错呢?我们来编译一下Java c编译一下abstract test02.java走。你看说bird不是抽象的,并且未覆盖I中的抽象方法move。这个错误提示的很经典,在第19行出的错。
07:00
说你这个类有问题。对吧,什么问题啊。是bird,不是抽象的。并且你还没有覆盖animal动物中的抽象方法。对吧,哎,所以说你要是单独这样写,那肯定是会出现问题的,这是有问题的,各位我们把这个注释掉,你不能这么干。啊,那我们应该怎么干呢?来,把这个拿过来。我们把这个方法重写覆盖一下,把这个抽象方法不是子类继承负类,会把负类的抽象方法继承过来吗?如果我继承过来抽象方法,我把它分号去掉,变成大括号,把这个abstract给它删了,哎,这样是不是就没事了呢?哎,我们编一下。没有问题了,好了,大家看,从这里可以得出一个什么结论啊各位。
08:07
重要结论重要结论五颗星。12345啊,必须记住一个非抽象的类。继承。抽象类。必须将抽象类中的抽象方法实现了。这是一个Java强行的一个要求,你不这么做,编译器不让你过。明白吧,一个非抽象的类继承抽象类,就是你一个非抽象的类去继承了你的抽象类。他要求你怎么着,必须将抽象方法在这里进行实现。
09:01
或者是覆盖,或者是重写,这里所说的覆盖、重写、实现是一个意思。注意啊。这是Java语法上强行规定的必须的。不然编译器就报错了。啊,不然编译器就报错了。抽象类。呃,应该这样说啊,换个行。一个非抽象的类继承抽象类,必须将抽象方法。实现了。来注意这里的。呃。覆盖吧。或者说重写。也可以。
10:00
叫做什么呀,哎,实现。就是对抽象的实现,对抽象的实现好大家看就是这个东西呢,你得听话,你不听话,你看看行不行。不行吗?你是不是必须得这么干,你看你只有这么干,你看他才让你过,你看是不是?好了,各位,我再问大家一个问题啊。这是个强行要求啊,这是非常非常重要的啊,重要的重要的一个内容,各位啊,就是说你如果说是负类,是抽象的,然后有抽象方法,我此类再去继承你这个抽象类的时候,我必须把你这个抽象方法在这里进行方法的实现,或者叫方法的覆盖,或者叫方法的重写,必须做这件事情,如果你不做这件事,编译器不让你过,死活不让你过,你就过不去。所以你好,哎,怎么办,你想好对吧,你就给他写上。你给他写上啊,写出来把大写出来,把abstra关键字去掉啊,这样的话,对这个方法进行实现,你看就没事了。
11:08
他有这样一个要求。啊,那如果说我这个鸟儿是抽象的行不行,各位。如果我这个鸟是抽象的,我这里是不是可以不写那个方法?有没有想过这个问题?你的父类animal是一个抽象类,有抽象方法。如果我的子类鸟儿去继承animal的话,我这个鸟儿它也是抽象的,那么大家思考一下,抽象类里边。允许不允许,有抽象方法允许啊。所以你子类bird去继承animal的话,它虽然把抽象方法继承过来了,诶没关系,为什么?因为我这个类是抽象的。
12:04
所以如果你前面加一个abstract,其实也可以不去实现那个抽象方法。啊,就是如果什么呀,如果波的是。抽象类的话,那么这个。Animal中继承过来的抽象方法也可以不去什么呀,重写覆盖实现。明白吗?来编译一下,你看没事儿,你看一点儿事儿没有,人家说得很清楚啊,说错误鸟儿不是抽象的。对吧?哎,也就是说那鸟儿如果是抽象的,那倒好说你这么写我允许你,其实大家不用死记硬背啊,我不知道大家有没有去理解里边的一个奥秘。
13:01
这个奥秘是什么,各位,这个奥秘就是说呀。抽象方法必须出现在抽象类里边。Word不是抽象的,你继承了父类,你把抽象方法继承过来了。抽象方法在里边。你这个类必须得是抽象的呀,你这个类不是抽象的。那我就不能有抽象方法,不能有抽象方法,反过来就强行要求你干什么呀,把这个方法给它覆盖了。重写了,或者是实现了。那或者说你可以把bird设置成抽象的,那么抽象类里边是可以有抽象方法的,它继承animal,可以把animal抽象方法继承过来放到这儿,所以在这里你就可以怎么着啊,不去重写这个方法,不去覆盖,也不去实现这个方法是没有任何问题的,刚才编译是哎,通过的,你看通过没有任何问题。啊,所以呢,这块呢,有一个很巧妙的东西在里边,哎,不知道大家有没有感受到啊感受到嗯,是这样的。
14:06
是不是啊?嗯。可以吧,哎,但是如果你把这个方法注释掉行不行,那就废了,编译器报错了。对吧,哎,你必须得把它怎么着覆盖了,把木放覆盖了,要么你把B变成抽象的。对,两个方案,你可以把这加一个abstract给它抽象了,你也可以把这个方法给它覆盖了,这两种方案你选一个,你至少得做一个,你不做一个,他不让你过,你做了这个重写覆盖或者是实现,他就让你通过了。所以这个里这个里面我讲了一个非常非常重要的一个,呃,语法机制,各位啊好了,那么接下来呢,我们可以在bird里面,在move方法这我们输出一句话,我们system.out点打印,我们输出什么叫叫鸟儿在飞翔。
15:00
是不是好?那么请同学们告诉我,你的父类是animal,子类是bird,这里能不能用多肽?能不能使用多肽各位?啊。什么是多肽啊?这里能不能写成父类型引用指向子类型对象?怎么写animal等于一个bird行不行啊?Bird,前边没有abstract,这说明我们这个类能不能创建对象。可以吧,创建完对象之后,由于它这个类的父类是animal,所以我前面能不能写个animal啊。爱好。这就是面向什么抽象编程?A是animal animal是抽象的呀。
16:01
你说你写这个代码往后调用A点某某某,A点某某某,你想想是不是都是通过A去调的,你调A里边的东西是不是调的都是抽象的东西。所以这叫面向什么?抽象编程。有同学老师这边抽象编程有什么好处?其实之前我在给大家讲那个主人喂养宠物那个,还记得吧,Master那个。宠物pet喂养的时候是怎么说的?其实就是面向抽象编程,不要面向具体。能用多肽就用多肽吗?对吧,哎,就是说。啊,这又是思想方面的东西了,又,又到这儿了。这就是面向抽象编程以后你都是调用的什么,调用的A点某某某啊。A的类型是animal animal是抽象的呀。
17:06
对吧,哎,面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力,你又听不懂啦。对吧,哎,这种编程思想符合O原则。听不懂的,就当我没说。但是你得会调各位,就是你得承认这个代码能这么写,这叫向上还是向下转型啊,向上转型我不管在座的各位啊。到底能不能听懂我这个思想,这个都是次要的,你看我今天提这些思想对吧。哎,明天我还会提,大后天我还会提,我在这一个月里边,我每天都去提,哎,你慢慢慢可能就被我的思想干啥呀感化了,明白吧,这个思想的感化是需要一个过程的,大家不用着急,但是你必须得承认,现在这个代码是可以这样写的。
18:11
说鸟儿是一个动物,能说通吗?Animal a等于new bird,这可以啊,这叫向上转型吗?父在上,子在下,子转成父,这叫自动类型转换。是不是哎,自动类型转换,那么接下来我们在这里呢,这个思想大家如果不懂的就先放一放啊,然后接下来我a.move。我问大家个问题,这个目方法编译的时候是谁的目?运行的时候是谁的目?分析一下分析啊,分析一下编译的时候,这个目方法是谁的。运行的时候,这个木方法又是谁的?
19:01
编译的时候,这个编译器只知道A的类型是啥,一个动物。所以他去动物里边找,诶有一个方法叫木,诶不错不错,诶绑上了。编译器通过了当你运行的时候,底层堆里边真实创建的那个对象,它是一个鸟儿对象。明白吧,所以它会执行到我们鸟儿里面的母方法。他会执行这个,在执行的时候会执行这个。在编译的时候会绑定这个。在执行的时候会执行这个,这叫多态,编译是一种状态,运行是另外一种状态。对吧,运行就跟具体的鸟儿有关系,因为你真正在移动的时候,是一个鸟儿在移动啊。是个鸟儿在移动啊。对吧,所以它会掉到鸟儿上面,重写之后的方法。对吧,重写之后的方法。其实他是一环扣一环的,假如说你这块没有对这个方法进行实现。
20:04
大家想一想,如果Java允许这么干的话,Java是不是自己自己等于等于自己扇自己大于一个大嘴巴子,你好好想想是不是这样的,如果说一个非抽象类去继承抽象类的话,他没有强迫你把这个方法实现的话,假如说你有一些没有没有写这个方法,那子类继承负类是不是还是抽象方法在这里边,那么他的抽象方法连个方法体都没有,你在运行的时候是不是根本就没法运行啊?也运行不了对吧。你好好想想是不是这个理啊,所以你看加法它设计的好巧妙好巧妙好巧妙的,一环扣一环的,他让你把这个方法直接干啥呀,子类继承抽象类把方法重写,必须写,你不写这个方法,你不加个大括号,它不让你通过,你加上它才让你通过,然后呢,在运行的时候,它自动会掉到这个鸟儿上的什么哎,木方法。就感觉这东西一切都是安排好的一样,所以有的时候你去想这个思想呢,你就会发现,哎,公司的这帮人真的是哎很牛,程序员真的是很牛,我觉得啊,在这个一环扣一环设计上面,我觉得这个设计是常非常感人的啊,有的时候呢,你会非非常感动啊。
21:14
这种巧妙的一种设计啊,巧妙的一种设计,但是可能现在大家感觉不出来啊,为什么,因为你可能只是停留在一个基础语法上面啊,基础语法上面慢慢的当你从通过一个。通过一个小白变成一个哎程序员,通过程序员变成一个高级软件工程师,哎,那你这一切你就明白了啊,要有具体的项目才能真正理解,对,就是这样,慢慢来吧,以后你们做项目再说啊,咱们先不管这个,我我这个思想说的咋样啊,总之呢,Animal a等于new bird,这个应该是能看懂吧。然后a.move编译的时候,这个方向谁的呀,是animal的对不对,Animal里边有没有move方法呀,有吧,然后后来是运行的时候,什么什么运行啊,哎哎,是个鸟儿运行,那么鸟儿运行的话,那么这块是什么呀?
22:02
哎,就就运行这个里边的这个方法啊,里边方法有同学说老师,那如果说我要是不写这个方法,我要是把这个类写成抽象类呢,哎,对不起同学,你写成抽象类啊,你这拗不了。你有没有发现又很巧妙?对吧,你拗不了啊,因为我说抽象类你是拗不了的,创建不了对象。是不是啊,你既然能创建对象这个类,它肯定不是抽象类。他不是抽象类,你这个方法就必须得写上。你写上它编译的时候绑这个运行的时候是这个对象,它就执行这个方法。啊,就这样的,所以他哎很巧妙啊,它就应该是这样设计的,有些东西它就应该是这样设计的,它不是这样设计,它不行啊,一环扣一环好了,总之呢,我不管同学们有没有听明白啊,我在这里啊,我只讲了一个重点,各位这个重点是啥?各位就是说当你一个抽一个非抽象的这个类继承抽象类animal的时候。
23:02
要求你把这个抽象方法在这怎么着给它实现了啊,要求实现了就这个结论啊,就这一个结论。啊,那么这个程序能不能编译,能不能运行呢?我们看一下好吧。Java c编译一下abstract test02java。然后呢,我们Java运行abstract test02走。好,鸟儿在飞翔。是不是,哎,鸟儿在飞翔,那么。我们还可以接着写别的呀,对不对,你比如说在这再写个class叫cat行不行,继承谁呀,Animal对不对?哎,继承animal,那么当你继承animal之后,你去编译这个程序,你能编译通过吗?报错,为啥?因为你没有重写那个方法。对吧,他报错了,你五十五行报错了,就是你这块必须得重写那个方法,Cat去继承animal,因为你是非抽象的,所以你必须得把这个方法给它重写了,于是乎呢,你把方法拿过来放到这个地方之后,你把它变成大括号前面这个地方,哎,你ABSTRACT1定要给它去掉啊,不去掉会有问题的。
24:09
好,那么接下来你就可以在这里写set.out line打印输出,它强行要求你,你必须得写这个方法,你不写这个方法,编辑器报错是吧?哎,你就可以写上,比如说猫猫在走猫步。哎,猫在走猫步啊,来我们编译一下。啊,编一下。运行一下abstract test02哦,鸟儿在飞翔,我们还没有调啊,调一下来,这边得调一下啊,怎么调animal X new一个cat。这还是多肽吗?是不是,然后X点什么呀。X是一个animal。
25:00
编译的时候木方法是animal的。等号后面的这个是一个什么呀。哎,Cat它会执行cat这个对象上的什么,哎,Move方法,Move方法啊行,那么这块的话,咱们Java c编译一下啊,编译之后我们去运行你看。猫在走猫步是不是?哎,不错啊,这个抽象类的基础语法就这些,各位啊,就这些。我们就说到这儿啊。
我来说两句