欢迎转载但请标明出处: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-->bus showADs.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