探索Java interface和abstract类的秘密
来源:互联网 发布:傲剑神照经升级数据 编辑:程序博客网 时间:2024/06/05 22:33
欢迎转载但请标明出处:http://blog.csdn.net/android_for_james/article/details/51104785
我们先来想清楚这件个例子:
飞机和鸟是不同的两类事物,但它们的共同的功能就是都会飞,我们可以创建两个类,一个是class Airplane{},一个是class Bird{},但是我们不可以将Fly也创建为一个类,因为它是一种功能(方法)所以我们只能把它抽象成一种接口,Airplane类和Bird根据飞行功能的差别来分别实现自己的Fly接口。如果飞机的类型不同则直接继承Airplane这个类就好,不同种类的鸟也是一样。
这样我们就直观的看出类是一种体现共性的一个分类,是一类事物就有和父类相同之处我们只需要继承父类就好,而接口是一种体现一个类具不具有某个功能,如果具有我们就去实现这个接口,否则就不实现。
接下来我们先来看abstract类,它既然叫~类我们就可以认为它就属于java类的一个分支,因此它的作用就是用来被继承,与普通方法相比,它内部可以有普通方法和abstract方法,而对于abstract方法只可以声明不可以写实现,通过这个特性我们可以想到这个方法可以让我们只关心操作,而细节的实现交给继承它的非abstract子类去实现
这时就可以看出我们可以面向抽象编程,比如我们声明一个计算柱体的底面积为一个abstract类,我们在计算底面积时需要考虑柱体的底面是矩形,三角形,圆形还是其他,这时我们只需要在abstract类中声明一个叫getArea()的abstract方法即可,具体的计算交给具体的不同形状的类去继承并实现,我们来看具体代码:
abstract class Geometry{//所有继承abstract类的类均都必须要重写里面的abstract方法!public abstract double getArea();} class Circle extends Geometry{double r;Circle(double r){this.r=r;}public double getArea(){return (3.14*r*r);}}class Rectangle extends Geometry{double a,b;Rectangle(double a,double b){this.a=a;this.b=b;}public double getArea(){return a*b;}}注意:
1.abstract类不能用new创建对象
2.抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public
3.如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
接下来我们再来看interface,接口泛指供别人调用的方法或者函数,从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。接口的定义与类的定义很相似,而且它和abstract类也十分相似,接口体中的方法也是抽象方法,也就是说在接口中定义的方法也只关心操作不关心实现,因此在一个类中想要实现接口必须重写它的所有抽象方法,一个类可以拥有多个接口分别用逗号间隔。接口其实是一种规范,我们可以这样理解这种规范就是生产电脑的厂商很多,但电脑需要有一个开机功能,为达到这个功能所有的厂商都需要实现同一个接口就是能开机就行,我们不需要管开机键的位置在哪或者开机的方式是怎样的。比如狗和猫都会叫,因此叫就是一个接口,而猫叫和狗叫的声音并不同我们只需要单独重写各自的叫声就好,下面我们来看代码:
interface Cry{void getCry();}class Dog implements Cry{public void getCry(){System.out.println("汪汪");}}class Cat implements Cry{public void getCry(){System.out.println("喵喵");}}注意:
1.接口体中只能有抽象方法,不可以有普通方法
2.接口体中的常量访问权限是public static final(可省略)方法访问权限是public(可省略)
3.所有实现接口的类必须重写接口中的所有方法,如果没有重写则这个类必须是abstract类
下面我们再来看看interface的细节用法:
package Unit6_3;public class Interface_test {//接口的实现public static void main(String args[]){Bus bus=new Bus();Taxi taxi=new Taxi();Cinema cinema=new Cinema();//带接口参数的类ShowAdvertisement showADs=new ShowAdvertisement();//接口回调:当接口声明的变量被赋予一个实现该接口的类创建的对象时,该接口变量就可以调用被类实现的接口方法WhichClass whichclass;whichclass=new Bus();//实际就是通知相应对象调用该方法whichclass.ShowClassName("公交车信息如下:");//如果一个方法的参数是接口类型,则我们可以将任何实现该接口的类的引用传入//这里会使用一个接口回调使showADs-->busshowADs.showAD(bus);;bus.Charge();System.out.println("");whichclass=new Taxi();whichclass.ShowClassName("出租车车信息如下:");showADs.showAD(taxi);taxi.Charge();taxi.ControlAirTemperature();System.out.println("");whichclass=new Cinema();whichclass.ShowClassName("电影院信息如下:");showADs.showAD(cinema);cinema.Charge();cinema.ControlAirTemperature();}}abstract class Vehicles{//定义一个abstract类它只关心操作不关心实现,既所有交通工具都具有刹车功能abstract void BrakeFun();}interface MoneyFare{//接口中的所有常量的访问权限都是public,而且是static常量//所有的抽象方法都是public//默认允许省略public abstract//收钱接口,在某些交通工具中可能会有收费项目但不是所有交通工具都具有,所以写成接口void Charge();}interface ControlTemperature{//空调接口void ControlAirTemperature();}interface WhichClass{void ShowClassName(String s);}interface GetAD{void GetADs();}class ShowAdvertisement{//这个类充当着面向接口编程的角色//面向接口编程核心是接口回调//这个方法传入的值是一个接口public void showAD(GetAD getAD){//接口回调getAD.GetADs();}}class Cinema implements MoneyFare,ControlTemperature,WhichClass,GetAD{public void GetADs(){System.out.println("体验浪漫情怀,享受视听盛宴。");}public void ShowClassName(String s){System.out.println(s);}//所有实现借口的类均需要重写接口中的方法public void Charge(){System.out.println("电影票价35");}public void ControlAirTemperature(){System.out.println("内置空调,室温22度");}}class Bus extends Vehicles implements MoneyFare,WhichClass,GetAD{void BrakeFun(){System.out.println("使用鼓式刹车");}public void GetADs(){System.out.println("文明开路,和谐进步");}public void ShowClassName(String s){System.out.println(s);}public void Charge(){System.out.println("公交车票价一元");}} class Taxi extends Vehicles implements MoneyFare,ControlTemperature,WhichClass,GetAD{void BrakeFun(){System.out.println("使用ABS防抱死刹车系统");}public void GetADs(){System.out.println("为您提供安全舒适的行程。");}public void ShowClassName(String s){System.out.println(s);}public void Charge(){System.out.println("出租车起步价10元");}public void ControlAirTemperature(){System.out.println("内置空调,温度为21度");}}
由此我们可以看出抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。
希望对大家有所帮助,欢迎转载但要标明出处,谢谢!
有什么不足的地方可以留言给我我会尽快回复并改正!
欢迎关注我的博客:http://blog.csdn.net/android_for_james
- 探索Java interface和abstract类的秘密
- java abstract类和interface的区别
- [Java] abstract类和interface的区别
- java abstract类 和 interface
- JAVA interface 和 abstract 类
- interface,abstract class,abstract interface Java中的接口,抽象类和抽象接口的异同
- java abstract和interface
- java abstract类和interface的区别,精辟!
- java abstract类和interface的区别,精辟!
- java abstract类和interface的区别,精辟!
- java abstract类和interface的区别,精辟!
- 由浅到深理解java abstract类和interface的区别
- Java 中 Interface与abstract类的区别和相同点
- Java中abstract和interface的区别
- java 的interface和abstract class
- java interface和abstract的区别
- 总结java的interface和abstract class
- java interface和abstract的区别
- 用jQuery前,先看看jQuery库文件件导入没!
- 【笔记】 《js权威指南》- 第17章 事件处理 17.7 - 17.8
- Android APK瘦身之Android Studio Lint (代码审查)
- jQuery使用简单示例 validate 插件
- Machine Learning第八周笔记:K-Means和降维
- 探索Java interface和abstract类的秘密
- 【HDU 1165】【水题】Eddy's research II
- 蓝桥杯第四题,就是快排,学习懂了应该很简单
- ASCII,GB2312,UNICODE,UTF-8总结
- Struts2返回JSON数据的具体应用范例
- golang map使用
- HDOJ 3639 Hawk-and-Chicken
- 用javascript实现基础动画效果
- 一种对网页进行适配处理的方法及网页适配装置