一、抽象类可以提供实现的方法,接口不能提供
JAVA接口和抽象类最大的一个区别就是,JAVA抽象类可以提供某些方法的部分实现,而接口不可以,这就是JAVA抽象类唯一的优点,但是这个优点非常有用。如果向一个抽象类里加入一个心得具体的方法时,那么它所有的子类一下子都得到了这个新的方法,例如下面的抽象类添加了一个实现函数,那么子类就可以直接是用这个方法了
public abstract class Test1
{
public void func1(){ //添加一个实现方法
}
}
而JAVA接口做不到这一点,如果想一个JAVA接口里加入一个新方法,所有实现这个接口的类就无法编译了,因为你不洗让每一个类都实现这个方法才行,这显然是JAVA接口的一个缺点
二、抽象类只能继承一个,而是用implements可以实现多个接口
第二点区别:任何一个实现JAVA接口的所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任一多个JAVA接口,从而这个类有了多种类型。
结合抽象类和接口的优点,最经典的设计模式就出来了:
声明类型的工作仍然由JAVA接口承担,但是同时给出一个JAVA抽象类,且实现了这个接口,而其他同属于这个抽象类型的 具体类可以选择实现这个java接口,也可以选择继续这个抽象类,也就是说在层次结构中,java接口在最上边,然后紧跟着抽象类,这就将两者的最大优点都返回到极致了,这个模式就是“默认适配模式”
//定义顶层接口
public interface ClassName1{
public void func1();
}
//定义实现抽象类
public abstract class ClassName2{
public void func2();
}
//定义实现类
public class ClassName3 extends ClassName2 implements ClassName1{
public void func1(){
func2();
}
}
这里先定义一个接口类,ClassName1,并为他添加了一个接口函数func1(),然后定义了一个抽象类ClassName2,添加了自己的实现函数func2(),最后可以定义具体的类ClassName3,它既继承了抽象类ClassName2,由实现了接口func2()。