JAVA-初步认识-第九章-抽象类-概述
一.
在继承的上半部分的讲解中,先是介绍了类之间的继承关系,然后从类间的变量,方法(覆盖)入手,接着就是整个过程的内存图解,最后就是final修饰的全局变量(是叫全局变量,还是全局常量?)。
继承中还有一部分,叫抽象类。(多次抽取,显得很抽象)
为什么会出现抽象类,举个例子。
截图中,DemoA和DemoB两个类具有相同的方法,如果两者之间没有继承关系(怎么看两者是不是继承关系?),那就可以向上抽取。抽取之后,子类继承父类即可。而且子类中的内容可以省略不写(父类中没有什么修饰符限制的成员,子类中完全复制么?),下面截图中保留了,其实可以省略。
这就是我们之前所讲的继承,发现事物之间的关系,并将共性进行向上抽取。这样的话,可以提高代码的复用性。
可是我们产生了一个问题:DemoA和DemoB确实有相同的功能,但是内容不一样。我们都知道功能内部一般都处于封装形式,DemoA必然有显示功能,DemoB必然有显示功能,但是内容却不同。那就意味着函数分两部分,第一部分叫声明是一致的,函数体或者函数内容不一致。所以我们能明确,它们也具备共性,声明相同,功能内容不相同,我们也可以向上抽取,因为它们具备相同的功能。
我们抽取了方法的声明,但是内容不能抽,抽不上来。最终形成的如下。叫做这类事物都具备这个功能,但是这工作的内容却不知道,因为每一个具体的事物都不知道。既然这个功能不能用大括号结束,定义不了内容的话,就用分号结束。结束语句,要么用大括号,要么用分号。
我们观看下面的截图,抽取出来的内容,真看不懂。这样的函数一定要做标识,怎么标呢?一定要用一个关键字abstract,就是抽象的意思。(只能提醒里面有这么一个方法,貌似作用不是很大)
抽象关键字修饰函数,就称为抽象函数。抽象函数所在的类也必须标识成抽象的,为什么呢?这个事物当中,具备一个功能。这个功能是什么,怎么做的,不知道。那么这个事物也不具体。这个就是抽象类的由来。(有必要这么抽取么?)
下面再举了一个例子,来描述抽象类。这里写的时候,我们是从下往上写的,先写了狗和狼,然后对相同的功能进行了抽取。但是,实际开发中,是通过分析,先有class 犬科,然后根据功能中具体内容的不同,分为狗和狼。
功能细节确定不了,就是抽象方法,不具体的方法。犬科这个事物也具体不了。
狗和狼继承了犬科,真正能具体吼叫,都是这些具体的事物,
有人会说,那既然功能的内容都不一样,那么就将犬科删去,干嘛还要抽象。但是在实际中,除了吼叫,还有其他功能,比如睡觉,无论狗还是狼,都是趴着睡觉。这样一来就不是抽象的。
(现在这么讲是有用处的,后面讲多态就知道了。)
抽取和不抽取是有区别的,抽取也没内容,还不是由子类来实现么。在用的时候,不一样。让狗叫一下,得指挥狗。让狼叫一下,得指挥狼....很多种,直接指挥犬科吼叫,就简单多了。
讲述抽象类的原因就在于不断地抽取,这样就会产生抽象的东西,就需要抽象类。