您的位置:首页 > 移动开发 > Objective-C

接口和抽象类的区别总结

2009-10-05 00:17 197 查看
接口内可以有成员,凡是接口内声明的变量,就算不用任何修饰符,都默认是public stastic final的。

 
抽象类:包括大多数派生类所具有的功能(具体实现类似)
接口:包括某些类(甚至不相关的类)所类似的功能(具体实现可以不同)
抽象类:家用电器
派生类:冰箱,洗衣机,电视,收音机...
接口:开关
实现接口的类:电视,收音机,水龙头,马桶...

关于这个,其实全部用接口也不是不可以,但是如果全部用接口,那么所有的继承类都将自己实现所有的方法,这个有时候是不必要的,将大大的增加程序员的工作量以及设计上的错误
比如有个接口Person,有个方法叫做sayHello,只是简单的打印一个sayHello(表示打个招呼吧),Person接口下面有两个子类SomeConcretePerson1,SomeConcretePerson,当然这两个子类也会继承这两个方法,但是由于是Person是接口,两个子类必须自己实现打印sayHello,这个明显会重复代码,何不在把Person改为抽象类,实现sayHello方法呢?

abstract class Person{
   sayHello(){System.out.println("hello!")};
}
SomeConcretePerson1 extends Person{};
SomeConcretePerson2 extends Person{};
------------------------------------
interface Person{
   sayHello();
}
SomeConcretePerson1 extends Person{
    sayHello(){System.out.println("hello!")};//这里明显跟下面是重复的代码
};
SomeConcretePerson2 extends Person{
    sayHello(){System.out.println("hello!")};//如果不小心还有可能两个打印不同的东西
}

所以可以看到java api很多类顶层只是一个抽象类而不是接口,比如Object
每个类都是继承Object,如果Object是一个接口,想想你自己写的类将要实现多少在Object里面定义的方法?没有这个必要了
还有一个很好的例子是MouseListener跟MouseAdapter,前者是接口,后者是抽象类,该抽象类是继承MouseListener,并且所有方法体为空,在具体应用上,由于implements MouseListener将必须实现所有的方法,有时候可能并不需要,可能只需要相应一个mouseClicked事件就够了,其他事件不用管,这时候你只需要extends MouseAdapter,然后overridemouseClicked方法即可,这个就是很好的应用了,不用全部实现接口的所有方法
 
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息