抽象类与接口的区别
1.语法方面的区别
- 抽象类可以有构造方法,接口中不能有构造方法
- 抽象类中可以有普通成员变量,接口中没有普通成员变量
- 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法
- 抽象类中的抽象方法的访问类型可以是 public,protected 和默认类型;但接口中的抽象方法只能是 public 类型的[默认为:public abstract]
- 抽象类中可以包含静态方法,接口中不能包含静态方法[包括静态块]
- 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意但接口中定义的静态成员变量只能是 public 的
- 一个类可以实现多个接口,但只能继承一个抽象类
2.设计方面的区别
- 抽象类 一般作为模板信息提供[变量、构造器、方法、抽象方法]
抽象类就相当于一个模板 模板中有子类可以公用的部分 也有需要子类自行实现的部分为模板式设计 - 接口 一般作为行为信息提供[方法]
接口是对行为的抽象 它只定义一组行为规范 每个实现类都要实现所有规范 叫辐射式设计
抽象类和接口的使用场景
- 抽象类 作为模型信息的提供者 描述子类的共有信息;
- 接口 用于描述专属特殊的 不是大家所共有的信息.
//抽象类Door
public abstrat class Door{
private String name;
private int price;
public Door(String name,int price) {
this.name=name;
this.price=price;
}
public abstract void open();
public abstract void close();
}
/**
* 防盗 接口 [提供专属功能 不是所有门都具备] [特殊的 专属的]
*/
interface ISteal{
void steal();
}
/**
* 防火 接口 [提供专属功能 不是所有门都具备] [特殊的 专属的]
*/
interface IFire{
void fire();
}
/*
* 普通门
*/
class PanPan extends Door{
public PanPan(String name,int price) {
super(name,price);
}
public void open() {
System.out.println("open...");
}
public void close() {
System.out.println("close...");
}
}
/*
* 具有防盗功能的门
*/
class WangLi extends Door implements ISteal{
public WangLi(String name,int price) {
super(name,price);
}
public void open() {
System.out.println("open...");
}
public void close() {
System.out.println("close...");
}
public void steal() {
System.out.println("steal...");
}
}