首先来看看接口的定义:接口,在JAVA编程语言中是一个抽象类型,主要是抽象方法的集合,接口中的变量定义必须为public static final类型。接口通常以interface来声明。
抽象类: 从面向对象的角度来讲,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样,并不是 所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就可以认为是抽象类。。抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
从定义角度来看,接口和抽象类是两个几乎没有太多联系的设计。接口只是一个抽象方法的集合。而抽象类本质上是一个类,但是它不能被实例化,但是类具备的大多特性抽象类都有。抽象类和interface在Java语言中都是用来进行抽象的,他们除了都是一个用于抽象的东西之外几乎没有任何相同之处。事实上对于一个java里的类来说,无外乎由两种成分组成,即变量和方法(静态代码块可以写在类里面但从实际效果角度并没有影响一个类)。因此接口的功能仅仅包含其中一部分,即方法的集合以及一部分静态成员变量。这样来看,接口是一种非常高的抽象,里面定义的东西被认为是不会改变的。抽象类里面就可以定义普通的成员变量,抽象类的抽象程度相对接口来说会低一点。
但是对于java来说个人认为设计接口的最大原因是为了支持多继承,从这个角度来说,抽象类和接口最重要的区别应该是在使用的时候的区别:
类可以实现多个接口,但是只能继承一个类
其他的区别就非常多了,本质上是一些java语言规则方面的区别。例如:抽象类可以写方法实现,接口也可以写方法实现,不过需要加上default修饰,等等。
问题:什么时候用接口什么时候用抽象类?
抽象类的关键好处在于 能够实现面向对象设计的一个最核心的原则OCP(Open-ClosedPrinciple)。因此当我有一部分内容是不想让子类修改的,但是子类又都通用,同时各个自乐又有自己的特点,那么就适合使用抽象类。
在面向对象领域,抽象类主要用来进行类型隐藏。 我们可以构造出一个固定的一组行为的抽象描 述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个 抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知 道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
符合开发封闭原则,我可以对抽象出来的类进行扩展,但是只要是这个抽象类的子类,那么他必然能够。
从语法层面上讲,java单继承多实现,而接口可以多实现。