面试题之——抽象类(abstract class)与接口(interface)的差别

面试题之——抽象类(abstract class)与接口(interface)的区别
  1. 抽象类可以有构造方法,接口中不能有构造方法。(虽然抽象类有构造方法,但它也不能被实例化)
  2. 抽象类中可以有普通成员变量,接口中没有普通成员变量。
  3. 抽象类和接口中都可以包含静态成员变量。抽象类中的静态成员变量的访问类型可以是任意类型,但接口中定义的变量只能是public static final,并且默认为:public staic final类型。(接口毕竟要被子类实现,所以成员变量必须是public,如果是其他访问类型,那这个变量存在还有什么意义)
  4. 抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法。
  5. 抽象类中的抽象方法访问类型可以是public, protected和默认。但接口抽象方法只能是public类型的,且不管接口的方法是否使用public abstract修饰默认即为public abstract类型。(例如:在接口中定义void add();方法  是和public void  add(); 、public abstract void add()等价的)
  6. 抽象类中可以包含静态方法,而接口中不能包含静态方法
  7. 一个类可以实现多个接口,但只能继承一个抽象类。
  8. abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的, 仅仅是实现了interface定义的契约而已