您的位置:华清远见教育科技集团 >> Android资料 >> Abstract class和Interface的使用  
 
Abstract class和Interface的使用
分享到:

abstract是一个修饰符,其类似于Static这样的关键字。Android程序中常用abstract修饰一个类,如abstract class,当然能它也可以修饰一些变量或是方法。

抽象类所包含的方法可以只是定义,也可以是已实现的。对于没有实现的方法,基于该方法的子类必须实现;而对于已经实现的方法,子类可以重写该方法,若没有重写,则使用父类的方法。

在一定程度上,abstract class可以代替Interface,例如,《Android Interface的使用》一文中,Interface的例子做如下的abstract class替换,其效果是等价的。

代码清单1-1 InterfaceServer.java

public class InterfaceServer {
      abstract class OnClickListener2{
        public void onClick2();
      }
      private OnClickListener2 mOnClickListener2=null;
      public void onClick2(){
        if(mOnClickListener2!=null)
        mOnClickListener2.onClick2();
      }
      public void setOnClickListener2(OnClickListener2 l){
      mOnClickListener2 = l;
    }

Abstractclass和 interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstractclass和interface的选择显得比较随意。其实,两者之间还是有很大的区别的。

Interface与abstract class的区别

1.从语法角度讲,接口和抽象类有以下区别:

·Java语法规定,一个子类只能有一个父类,但可以实现多个接口。

·abstract class可以代替Interface。

·定义Interface时,只需要列出所包含方法的定义而不必实现。而定义Abstract类时,方法必须有实现部分,这就是所谓的默认实现,除非该方法也是Abstract类型。

·接口的子类必须实现接口所定义的全部方法,而抽象类的子类不必实现抽象类所定义的任何方法,除非该方法是Abstract或者子类想重写某个方法。

·接口中的成员变量必须是Static Final类型(实际应用中则很少包含变量,因为接口多用于引用),而abstract class内部可以包含任意变量。

2.从应用的角度来讲,Interface和abstract class的区别在于:

·Interface提供了一个方法集合的接口,该接口用于客户端和服务端的方法调用,如图1-1所示。


图1-1 Interface的使用机制

·接口一般是由服务端定义,比如操作系统,客户端根据自己的需求对接口做不同的实现;而abstract class则仅提供了一个基类,该基类没有任何服务端或者客户端的概念,它的作用就是为了继承并重写,如图1-2所示。


图1-2 abstract class的使用机制

3.从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想,但是在具体的使用上面还是有一些区别的:

·abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。

·在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。

在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面(一般通过abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。

同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。

 更多相关文章

·Android Interface的使用
·Android程序UI设计
·AndroidManifest.xml文件详解
·Android程序在模拟器和手机上如何运行
·创建Android工程的基本步骤