Java中的接口与抽象类的区别

来源:互联网 发布:手机淘宝登陆连接失败 编辑:程序博客网 时间:2024/06/07 06:38

Java抽象类与接口的在定义上的区别主要有以下几个方面:

1.访问权限:

在接口中,只能是public类型的,不能为private或者protected或者默认的包访问权限。在抽象类中,访问权限可以为public 、private 、 protected 、或者默认权限。

2.成员变量:

在接口中,成员变量只能为public static的。即使你在接口中 写的诸如public int a=1;这种没有加上static关键之的常量,其实经过反汇编之后会发现jvm自动加上了static关键字。在抽象类中,其成员变量的定义与普通类相同。


3.成员函数:

在接口中,成员函数只能为public abstract的,并且都未实现。即使你在接口中写的public void methdo();这样的函数,实际上他被jvm自动添加了static关键字。在抽象类中,既可以包含非抽象的普通方法,也可以包含抽象方法,还可以包含静态方法。注意:普通方法的访问权限是随便的,但是抽象方法的访问权限不能为private;


4.构造方法:

接口内不能有构造方法在抽象类中可以有构造方法。


5.实现:

接口使用implements实现,并且一个类可以实现多个接口;抽象类使用extends实现,一个类只能继承一个抽象类。这也是这里主要要讲的一点:在<Effective Java>中讲到接口由于抽象类。主要原因一个是由于考虑到类层次的问题,一个是考虑到扩展性的问题。下面主要阐述一二:a.类层次问题:假设让两个类同时扩展一个抽象类,势必要将抽象类放到类层次的高处,以便这两个类的父类成为这个抽象类的子类。这样一来,这个父类的其他子类也扩展了这个抽象类,这是不必要的。b.在扩展性问题上,接口是Mixin(混合类型)的理想选择【Mixin简单来说就是将多个类的功能综合到一个类之中,Java的Decorator可以实现Mixin,其实也就是采用了《Effective Java》的复合优先与继承的思想。】。但是接口只能定义而不能有具体实现,而抽象类却可以包含实现。为了整体这两种类型的优点,有人便提出了"缺省适配模式":为每个重要的接口提供一个骨架实现类。骨架实现被称为AbstractInterface,Collections Framework为每个重要的集合接口都提供了一个骨架实现,包括AbstractCollection、AbstractSet、AbstractList和AbstractMap。此模式的具体做法是:声明类型的工作仍然由Java接口承担,但是同时给出一个Java 抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类,也就是说在层次结构中,Java 接口在最上面,然后紧跟着抽象类。【此处摘自:http://blog.csdn.net/xw13106209/article/details/6923556】骨架实现的代码,见博客:http://blog.csdn.net/xw13106209/article/details/6923556




0 0
原创粉丝点击