Leo

Results 1 comments of Leo

我从三个方面来说明它们的区别: 第一点是它们的定义: 1、方法和代码块 在抽象类中可以有构造器、静态方法和非静态方法、以及静态代码块,并且可以提供方法的实现。但是在接口中,jdk1.8以前,只能存在public的抽象方法。jdk1.8以后,可以用default修饰方法,以提供方法的实现。 2、成员变量 抽象类中的成员变量可以是各种类型的,但接口中的成员变量只能是 public static final 类型的。 第二点是它们的使用: 首先,它们都不能被实例化。一个类只能继承一个抽象类,但可以实现多个接口。 第三点是访问速度和拓展性: 抽象类访问速度比接口速度要快,因为接口需要时间去寻找在类中具体实现的方法; 拓展性:要往抽象类中添加新的方法,可以直接提供默认实现,不需要改变现有的代码。往接口中添加方法,还需要改变实现该接口的类。 其他: 抽象类表示的关系是is a; 接口表示的关系是has a。 为什么接口的成员变量用static final修饰: static:避免子类使用时产生歧义。(子类可能实现多个接口,多个接口的变量名可能一样) final:既然必须是static修饰的,那么所有子类共享。而接口是一种抽象, 所以一个子类修改了值会影响到其他所有子类,因此就不应该允许子类修改这个值,所以也必须定义为final。