探索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





0 0
原创粉丝点击