1.抽象类
莱特兄弟发明了世界上第一架战斗机,实现了人类的飞天梦,发明了飞机以后啊,有一对菜特兄弟就想在飞机上按上武器什么机枪,大炮之类的。想在自己飞在天上,别人打不到自己,自己还能打别人,多爽啊。可惜的是兄弟俩对武器不了解,按不上去啊。。,于是只能作罢,但是兄弟俩,把自己的想法写进了飞机图纸里,希望后人来实现,后来人们接受了他们的思想,造出了各式各样的战斗机(子类),上面都安装了武器。当年菜特兄弟对战斗机的构想就是抽象类。、
抽象类说白了就是一个子类的模板,后代战斗机不管在怎么变,也脱离不了携带武器这一特性,菜特兄弟的构想就是战斗机的模板就是抽象类,而他们当年设想的武器攻击 就是抽象方法 因为你的战斗机按机枪也好,挂核弹也罢,攻击都是你绕不开的方法。
抽象类和抽象方法的规则:
- 抽象类,抽象方法必须用abstract修饰,有抽象方法的类一定为抽象类,抽象类里可以有普通方法。
- 抽象类不能被实例化
- 抽象类可以包含 成员变量,方法,构造器,初始化块,内部类。
- 抽象类只能被继承,不能做子类(人家菜特兄弟的想法可是完全自己想,没有参考资料的)
- 继承抽象类后,必须实现抽象方法(你说你的飞机是战斗机,却没有武器攻击方法,咋地想全靠撞啊???,所有必须实现武器攻击这一抽象方法)
- abstract方法必须子类实现才有意义,所有不能是private(你有好想法,藏着掖着干啥!)所有abstract和private不能同时用。
2 接口
前面说过战斗机有攻击,所有的战斗机的有攻击这个方法,类比一下鸟类,鸟会飞,所有咱们就定义一个鸟的抽象类就ok了呗,所有鸟继承抽象鸟类,都实现飞的方法,挺简单的啊,和接口有什么关系吗??大家请看看这货
一只鸵鸟??
这家伙不会飞啊。。。那怎么办,把它开除鸟籍?说它不是鸟?好像也不行,看来问题出在飞这个特性上,总不能定义一个飞的抽象类去叫能飞的鸟继承吧,java世界里也不能怎么(不符合现实世界逻辑)。既然如此,为何不定义一种技能呢,定义飞技能,谁想飞就给谁飞这个技能呗。 飞这项技能便是接口。
接口的规则:
- 接口可以包含成员变量(只能是public static final型),方法(只能是抽象方法,类方法,默认方法,实例方法),内部类。
- 接口可以继承,会得到父类的所有抽象方法和常量。
- 接口可以多继承。
- 一个类可以继承一个抽象类和实现(implements)多个接口,弥补java单继承的缺点。
接口的继承。
鹦鹉继承鸟抽象类且添加飞的技能
3 抽象类与接口的区别
语法层面上的区别
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
设计层面上的区别将在下一章【趣说java】之抽象类与接口的区别中详细解答。
在征得本博客作者同意的情况下,本博客的作品允许非盈利性引用,并请注明出处:“作者:____转载自____”字样,以尊重作者的劳动成果。版权归原作/译者所有。未经允许,严禁转载。