一、两者的共同点
都不能被实例化成实际对象
二、两者的区别
语法区别:
1. 接口全是抽象方法,抽象类中不一定全是抽象方法
2. 接口没有实例域,抽象类含有实例域
3. 一个类只能继承一个抽象类,但是可以实现多个借口
4. 抽象类修改子类不一定变动、接口修改那么其实现类一定全部变动
设计区别:
1. 抽象类是对类的抽象提取,类与抽象类的关系是"是不是"即抽象类是不是要继承类的父类
2. 接口是对类的需求功能描述,类与接口的关系是有没有,即类有没有接口中定义的功能
三、理解设计区别
例如现在有动物,拥有进食和繁殖的功能,那么我们可以定义为抽象类-Animal类
public abstract class Animal
{
public abstract void eat();
public abstract void reproduction();
}
也可以定义为接口-Animal
public interface Animal
{
public abstract void eat();
public abstract void reproduction();
}
那么这个时候定义狮子类和狗类,不管是继承还是实现,都会有着两个基本的功能,看上去抽象和接口没有区别
假设这个时候如果我有一个宠物的方法要加进去,使得动物有变成宠物的功能
如果加入到抽象类中,那么继承Animal的类如狮子类会有宠物功能,也就是宠物狮子这不现实
如果加入到接口中,那么所有实现Animal接口的类如狮子类会有宠物功能,也就是宠物狮子这不现实
按照常理应该是动物都有进食和繁殖功能,但不是所有动物都有宠物这个功能。因此可以看出宠物这个功能并不是动物类的基本功能,而是一种额外需求
因此我们应该设计动物为抽象类,把宠物这个方法设计为接口,这样定义老虎类继承动物类,这样老虎有基本的进食和繁殖功能,但不是宠物,定义狗狗类继承动物类且实现宠物接口,这样狗狗有基本的进食和繁殖功能且是可以当宠物
动物类:
public abstract class Animal
{
public abstract void eat();
public abstract void reproduction();
}
接口:宠物
public interface Pet
{
//宠物方法
public void pet();
}
狮子类:
public class Lion extends Animal
{
@Override
public void eat()
{
}
@Override
public void reproduction()
{
}
}
狗狗类:
public class Dog extends Animal implements Pet
{
@Override
public void eat(){}
@Override
public void reproduction(){}
@Override
public void pet(){}
}
四、何时使用抽象,何时使用接口?
1. 当需要提供一个模板用于生成不同的子类扩展功能的时候使用抽象类
2. 当不同的类需求某个共同的功能时,使用接口
3. 这个只是概念,具体的要在实际项目中多编程多遇到有经验了才会加深印象