接口:
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
抽象类:
使用了关键词abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。
上面给出的是定义,下面说说相同点和不同点:
相同点:
1.不能被直接实例化;如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2.抽象类的抽象方法必须全部被子类实现,接口类的方法也必须全部被接口实现类实现;如果这个子类没有全部实现抽象类的抽象方法那么这个子类也只能是抽象类;如果这个接口实现类没有实现所有接口方法,那也只能是个接口;
不同:
通过相同看不同已经可以看出最大的一个特点:
1.抽象类可以有自己的默认方法实现;接口在java8以后才出现可以使用default修饰的默认方法;
2.抽象类的子类用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要重写抽象类中的抽象方法;接口子类使用关键字implements 来实现接口,它需要重写接口中没有默认实现的方法。
3.抽象类可以有构造器,接口不可以有;
4.和正常的java类来比较的话,抽象类除了不能被实例化外和正常的java类没有太多区别;但是接口是完全不同类型;
抽象类的运用意义
在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
另可以参考:https://www.cnblogs.com/burns/p/4113527.html