深入解析abstract class 和 interface【2012年7月24日 小冬分享】
小冬:下午茶时间到了,工作有点累了,来杯咖啡如何?嗯味道还不错,再来点我为大家送上的“点心”,原来生活还是可以不错的,那怕只有这么一刻,窗外是谁在呼风唤雨?(台风韦森特)是你吗?也许现在的不是,但你要相信总有一天你也能。
abstract class抽象类:大家知道在面向对象的概念里世界万物都可以定义为某个类,一切皆对象,那么有class类不就行了吗为什么还要有abstract class呢?
在实际生活中有些类我们并不能描述具体对象,比如动物,它是某一类事物的统称,是一个抽象的概念,并不是某一种具体的事物
抽象类是不能够实例化的
使用抽象类能为我们带来什么好处呢?
抽象类可以构造出一组固定行为的抽象描述,就是把某类事物共有的东西抽取出来形成规范,而这些行为有许多可能的具体实现方式。
比如狗、猫都是动物,它们都要吃、会叫等,下面我们来点代码就更明白了:
- abstract class Animal{
- //假设动物吃的行为都是一样的,我们可以定义实现方法,这抽象类是允许的
- public void eat(){
- System.out.println("吃东西");
- }
- //定义抽象方法
- public abstract void cry();
- }
- class Dog extends Animal{
- //实现抽象方法
- public void cry() {
- System.out.println("汪");
- }
- }
- class Cat extends Animal{
- //实现抽象方法
- public void cry() {
- System.out.println("喵");
- }
- }
这样猫和狗都既能吃又会叫了,而且叫的还不一样,它们还可以扩展自己特有的行为,比如猫会抓老鼠,狗会看门等。
那么有了abstract class为什么还要有interface呢?它们之间有什么区别?
interface是一种特殊形式的abstract class,变量都是public static final类型
它的方法都是public abstract的,
我们知道java是单继承的,即只能继承一个类,而很多时候某个事物它既属于某一范畴又属于另一范畴,这就需要多重继承。
interface接口就是Java语言的设计者在考虑支持多重继承方面的一种解决方案,因此java是可以实现多个接口的
现在有个对象麻雀,它是动物,但是它又会飞行,我们怎么为麻雀添加飞行的行为?
方案一:Animal类加多一个方法abstract void fly().这样一来,其它动物继承Animal都要实现fly方法,显然并不是所有的动物都是会飞的。
方案二:麻雀类class Sparrow extends Animal,并有自己的方法void fly(),这样是达到了需求,但是还有其它会飞的动物呢?
方案三:引入一个概念:鸟类,那麻雀,它既是动物,又是鸟类,我们如何在程序中实现?
abstract class Animal{}, interface Brid{}.
class Sparrow extends Animal implements Brid{}
可是我们发现,这只麻雀是只电动玩具,要充电的,怎么办?
其它电动玩具也在充电,那怎么办?
那就抽象出一个新的接口啦
也就是接口的多继承,实现了。
补充(来自网络):
abstract class :抽象类;
抽象abstract修饰类的时候表示是一个抽象类,这个类不能实例化;
如果一个类中有抽象方法,那么这个类一定是一个抽象类;
如果一个抽象类可不可以没有抽象方法?可以的;
抽象类出现的目的就是为了继承;
抽象类一般用在哪里?一个抽象类一般作为工具类;
抽象类中的抽象方法目的就是为了覆盖;
抽象的方法,不能使用private修饰;
abstract class和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望各位能够细细体会。
本文出自 “新博客-http://cfei.net” 博客,请务必保留此出处http://johnny84.blog.51cto.com/2855387/941248