abstract class 和 interface 的区别:
在Java语言中,abstract class 和interface 是支持抽象类定义的两种机制。
正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。
abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,
因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。
abstract class 和 interface 在Java语言中都是用来进行抽象类定义的
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。
但是,一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,
而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,
不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,
interface表示的是"like-a"关系。
4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
7.接口中的方法默认都是 public,abstract 类型的。
含有abstract修饰符的class即为抽象类,abstract 类不能创建实例对象,
abstract class 类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法
含有 abstract 方法的类必须定义为 abstract class,abstract class 类中的方法不必是抽象的。
如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。
接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。
语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
- 抽象类中的抽象方法的访问类型可以是 public,protected 和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。 - 抽象类中可以包含静态方法,接口中不能包含静态方法
- 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,
但接口中定义的变量只能是 public static final 类型,并且默认即为 public static final 类型。 - 一个类可以实现多个接口,但只能继承一个抽象类。
两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。
而抽象类在代码实现方面发挥作用,可以实现代码的重用**
热门评论
Java8为避免在接口中添加新方法后要修改所有实现类,允许定义默认方法,包含方法体!
抽象类中抽象方法可以使用默认访问修饰符。