区别:
1、概念的区别:
抽象类是从一些类中抽取出它们共有的属性(例如某些相同的成员变量、属性相同(修饰符、函数名、参数类型、参数个数)的方法),注意方法的修饰符可以为public或者protected(因为假如是private则子类无法继承),缺修饰符情况下默认为public,抽象类注重于对类本身的抽象,抽象方法没有方法体,仅仅是声明了该方法,让继承它的子类去实现。
而接口主要是对类的行为的抽象,接口也可以有变量和方法,但是变量以及方法的修饰符都必须分别是public static final(省略时也会默认是这个)和public abstract(省略时也会默认是这个)。
注意:
在java 8以后, 对接口做了新的修改,允许接口有默认方法default,即可以为接口添加实现方法,这样实现接口的类就不需要做任何的改动就能继承该接口所实现的该默认方法了;这样就使得接口与抽象类更相似了(因为抽象类不仅存在抽象方法,而且还可以有具体的已经实现了的方法)。
2、语法定义的区别:
抽象类通过 public abstract class 抽象类名字 {成员变量1…n; puclic abstract 返回类型 抽象方法名1…n(参数类型、参数名字1…n){};}来定义。抽象类还可以有不是抽象方法的方法。上两行只是说明了抽象方法的语法定义。
接口通过public interface 接口名字{public static final 成员变量1…n;public abstract 返回类型 方法名1…n(参数类型、参数名字1…n){};}来定义。接口只能包含抽象方法(这是以前),在java 8以后可以包含默认的实现方法default(上面已经讲过了,这里再重复一遍)。
3、单继承与多继承的区别:
在java编程语言里,类与类之间只允许单继承,即一个类只能继承一个抽象类;但是一个类可以实现多个接口implements 接口1…n,实现多继承。
4、能否包含构造方法:
接口中不允许存在构造方法,因为接口的成员变量都是static final变量,是在编译的时候就完成了初始化操作了,也不需要通过构造方法来进行初始化操作,而接口的方法是抽象方法,和抽象类一样只是声明之后让实现它的类去完善该方法体的;而抽象类可以有构造方法,因为抽象类除了有抽象的方法以外,其余地方与普通的类其实是没什么区别的,所以可以通过构造方法完成一些初始化的操作。
相同点:
1、它们都不能被实例化,就是不能直接new()为它们分配空间,而是需要通过继承或者实现它们的类将它们实例化。
2、继承或者实现它们的类都必须实现它们所有的抽象方法。假如继承该抽象类的类没有全部实现抽象方法,则还是一个抽象类。
使用它们的技巧(场景):
当我们需要研究事物的本质属性时,可以考虑使用抽象类来讲它们共有的属性抽象出来,可以减少代码量,优化程序的结构;
当我们想要对某一种行为进行研究时,可以考虑使用接口,对很多的类所共有的该方法(行为)进行抽象,让不同的类去实现属于该类的方法,通过接口变量就可以实现接口回调。
补充:
接口变量:接口可以声明变量,称为接口变量。
接口变量可以存放一个对象的引用(地址), 要求该对象的类实现对应接口。
接口回调:指把实现了某个接口的类的对象的引用赋值给该接口声明的接口变量。
通过接口变量去调用被类实现的接口的方法。
通过接口变量无法调用类中非实现接口中声明的方法。