上节课我们讲述了继承的概念和实现。今天呢,在继承的基础上我们继续扩展。
今天的内容是:
1、抽象类的概念
2、抽象类的语法
3、抽象方法
4、抽象类的主要使用方式
第一部分:抽象的概念
抽象类是什么?其实抽象类就是普通类的再抽象类,并且呢,这个抽象类拥有抽象行为的能力。
举例来说,我们可以把人抽象为男人和女人两个类。那么,我们可以再将男人和女人再抽象为人这个抽象类。
这时,就会有人说,普通类也可以啊?
是的,普通类也可以依靠继承作为其他类的父类,但是呢,他没有抽象类的抽象能力。
那抽象能力怎么体现的呢?其实就是抽象方法。
只有抽象类可以定义抽象方法,普通类不能定义抽象方法。
抽象方法我们后面再来介绍,大家就先知道这个概念就可以。
我们还是通过例子来理解:
我们把类(男人、女人)抽象为抽象类(人)这个抽象类以后,人的这个类中就可以定义抽象方法。
那,什么样的方法适合定义为抽象的呢?其实就是子类的行为体现不一样,但是子类都有这个行为。
对于男人和女人这个例子来讲,我们就可以举爱好这个行为的例子。女人喜欢逛吃,男人喜欢玩乐。
那这个行为在不同的子类(男人,女人)当中是不同的表现,但是呢,这个行为对于人来讲都是存在的。
如此以来,就可以把这个公共的行为在父类(人)中先定义一个抽象的方法,不去实现细节。
等到子类(男人、女人)去继承人这个类时,实现这个行为时再体现。例子在后面。
第二部分:抽象类的定义
那么,一个抽象类如何定义呢?其实很简单。就是在class前面再加一个abstract关键字。
例如人作为抽象类:
abstract class Person{
}
抽象类和普通类的区别:
1、抽象类有abstract关键字,普通类没有
2、抽象类可以有抽象方法,而不是一定要有。普通类不能有抽象方法。
3、抽象类不能实例化对象
4、抽象类可以和普通类一样定义属性和方法。
我们用一张图对比下抽象类和普通类:
第三部分:抽象方法
我们了解完抽象类后,我们再来了解下它当中的神秘角色--抽象方法。
我们先来看它的定义:
我们在方法的修饰符当中加入abstract关键字,不编写方法的实现,这样的方法就是抽象方法。
格式:
修饰符 abstract 方法返回类型 方法名(参数列表);
/**
* 抽象类
*
* @author Dream ma
*
*/
public abstract class Person {
/**
* 抽象方法:爱好
* 男人女人都有这个行为,但是他们的体现都不一样。
* 在父类里只定义它的结构,不写方法体。
* 等到男人女人去继承这个类的时候自己去实现自己的行为。
*/
abstract void hobby();
}
1、抽象方法有abstract关键字;普通方法没有
2、抽象方法没有方法体(大括号和里边的内容);普通方法有方法体。
3、抽象方法在实现它的子类中必须被实现;普通方法自己有实现,子类再实现就是重写了。
第四部分:抽象类的使用
学习了抽象类和抽象方法的定义和知识,我们来总结下他们的使用:
1、使用方式一:作为类的模板
一、抽象类是其他类的抽象,可以作为其他类的父类。
二、抽象类可以定义一个抽象方法,实现子类必须去实现这个方法。
基于以上两点,并且由于抽象类无法被实例化,所以抽象类一般作为其他子类的模板,里边定义公共的属性和公共行为,而不作为实例类。
那有人就会问,普通类也可以作为模板啊。但是呢,普通类没有抽象方法。
没有抽象方法的话,子类去继承时就没有强制性。子类可以不重写方法。
如果我们的逻辑里需要子类必须有哪些行为,这个时候抽象类就拥有优势。
抽象类定义的抽象方法在实现子类里必须要被实现的。所以,抽象类在作为模板时更规范,适合为子类指定约束。
2、使用方式二:减少类实现接口时,实现的方法个数
我们后面会学习接口,接口里的方法也必须被实现类实现。
那么抽象类可以减少一些接口实现类实现的方法个数。
举例,接口A有a,b,c,d四个方法,但是这个时候我的某个类只需要其中的两个方法b,c,
这时候就可以先定义一个抽象类B,让他去实现接口A,使用空方法体实现a,d方法,把b,c继承下来作为抽象方法。
这个时候实现类C就可以继承B,只用实现b,c方法了。。是不是很棒??
今天的内容是:
1、抽象类的概念
2、抽象类的定义
3、抽象方法的定义
4、抽象类的使用
以上就是今天的内容,你学会 了吗?