一.
针对抽象类整体进行一个认识。
1.抽象类中有构造函数吗?
对于一个问题,我们在给出答案的同时,也要说明理由,接着拿代码验证理由。
抽象类是不能创建对象的,所以不需要构造函数。之前说过只要类一定义,都有默认构造函数。不能创建对象,要构造函数有什么用?虽然不能创建对象,但是抽象类有子类,其实抽象类中的构造函数可以给其子类对象进行初始化。(有子类就意味着继承,那么实例化过程还有么,父类必须要有空参数构造函数的,这里抽象父类中都没有构造函数。)
就是说,一个类的构造函数既可以给本类对象初始化,也可以给子类对象进行初始化。
答案是有,用于给子类对象进行初始化。
2. 抽象类可不可以不定义抽象方法
可以的。
为什么呢?抽象类里面一个抽象方法都没有,那么搞抽象类有什么意义?
有,很少见。目的就是为了不让该类创建对象。抽象类不能创建对象是由这个原因造成的?
这种类怎么表现不重要,后面会重点讲解。
通常这个类中的方法,有方法体,但是却没有内容。就是说{}里面为空,如下图所示。
判断是否有方法体,就看有无{},其实里面还是有内容的,就是return,但是隐式了。它和直接用();表示是两码事。
一个是有方法体,没内容。另一个是没有方法体。
上面截图中的类,创建对象,调用show1(),和show2()没有意义。没内容,运行起来有啥用?所以这种类一般都是抽象的。
后期会讲到为什么会有这种类,(联想之前的犬科,吼叫)。
3. 抽象关键字不可以和哪些关键字共存?
private不行,以下图为例,在方法的抽象关键字前面加上一个private。我觉着应该是不可以的,私有是不向外提供的,但是抽象类是要和外界联系的,因此不能加private(个人猜测)。
道理很简单,抽象方法是要被覆盖,一私有的话,子类就不知道了,不知道就不能覆盖了。因此不能和private连用(这也说明在抽象类中的抽象方法中,覆盖是很重要的概念。) DOS报错如下,
明明告诉我抽象需要覆盖,现在又把它隐藏起来,那还怎么覆盖。
static不行,这里说的不能和抽象关键字连用,抽象关键字都是在修饰方法。(抽象关键字修饰三种东西,类,方法,变量,这里没有交代清楚前提)
如果这成员变静态,还需要对象吗?就不需要了(静态意味着可以通过类调用,而不需要对象来调用)。大家都知道抽象方法运行没有意义,因为没有方法体,运行它干嘛,做什么运算都不知道。所以静态和abstract也不能共存。(这里的解释说明一点,只要是static标注的,就意味类要进行类名的调用方法。)
final不行,下面两种截图都是不可以的,一个是与覆盖冲突(有了final修饰类,那下面就没有子类的方法来覆盖了),一个是与其子类冲突(没有子类来继承)。
4. 抽象类和一般类有什么异同点
不要以为抽象类很特殊,抽象类和一般类是一回事。都是描述事物的,一般类有足够的信息来描述事物,而抽象类信息不足。
既然是抽象的,那当然也就不能建立对象。
5. 抽象类一定是个父类吗?
是的,抽象类要使用的话,必须通过通过子类对其抽象方法进行覆盖(对其进行抽象方法实现),不然用不了。
上述这些都是从抽象类的角度来讲解的一些问题,但是是否一定有抽象类,都不一定。