1. 抽象类可以提供实现方法,接口不能提供.
抽象类可以提供某些方法的部分实现,而java借口不可以,先核实java抽象类的唯一有点.如果想抽象类中加入一个具体的方法是,那么他所有的子类一下子都得到了这个新方法. 例如下面的抽象类添加了一个实现方法,那么子类就可以直接使用该方法了.
public abstract class ClassName1
{
public void func1(); //添加一个实现方法
{
}
}
java接口做不到这一点,如果向接口加入一个新方法,所有市县该接口的类就无法编译了/ 因为,你必须让每一个类都再进一步实现这个方法才可以,这显然是java接口的缺点. 例如下面为接口添加了一个接口方法, 那么实现该接口的类必须实现该方法;
public interface class ClassName2
{
public void func2(); //添加一个接口函数
{
}
}
2. 抽象类只能继承一个,而可以实现多个接口.
一个抽象类的实现只能由这个抽象类的子类给出,也就是说这个实现类处在抽象类所定义出来的继承等级结构中,,因为java语言的单继承特性,所以它作为类型定义工具的功能大打折扣...
java接口,任何一个实现了接口所规定的方法的类都可以具有这个接口的类型,...一个类可以实现任意多个接口,从而这个类有了多种类型..
由此,最经典的设计模式出现了,声明类型的工作仍然由java接口承担,但同时给出一个java抽象类,且实现这个接口,其他同属于这个抽象类的具体类可以实现这个java接口, 也可以选择继承这个抽象类.....也就是说,,java接口在嘴上敏,然后紧跟着抽象类,将两个优点发挥极致,,这种模式称为"默认适配模式".
实现代码如下:
//定义顶层接口
public interface class ClassName1
{
public void func1(); //定义一个接口方法
}
//定义实现抽象类
public abstract class ClassName2
{
public void func2() //定义一个实现方法
{
}
}
//定义实现类
public ClassName3 extends class ClassName2 implements ClassName1
{
public void func1() //实现接口函数
{
func2(); //调用抽象类函数
}
}
这里先定义了一个接口类class ClassName1 ,为它添加了一个接口函数func1() ,然后定义了一个抽象类class ClassName2, 添加了了自己的实现函数 func2() ,最后定义了具体类ClassName3 ,既继承了抽象类class ClassName2 ,又实现了接口class ClassName1 ,这样他就拥有了接口函数 func1() 和实现函数func2() .
接口在某些地方和抽象类有相似的地方,但采用哪种方式来声明主要参照以下两点.
1. 如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。
2. 如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。
|