我们都知道接口里只有方法名,没有方法体。抽象类也是,但是跟接口最大的不同之处在于当程序有必要的时候可以往抽象类里面写方法体,以提供方便(虽然不推荐这么做)。
而且因为Java的单继承性使得,一个类不能从另一个类继承太多的方法。因此这种情况应该使用接口,用接口来定义很多方法,方便类实现这些方法。
当一个类实现了一个接口,那就说明它把接口里的方法都实现了-也就是说类里有接口里的所有的方法,因此占用了很大的资源空间,不管它有没有使用这些方法。
但是当一个类继承抽象类的时候,加入这个类没有调用父类的方法或没有重写这些方法,那这个类就不会实现这些方法,也就是说省了很大的空间。
基于这个特性,出来了一个非常常用的模式-缺省适配器模式。
两者相似之处在于:抽象类和接口都不能被实例化,两种都是java实现抽象的方式。不同之处分两个方面:
一、语法层面
1. 抽象类可以有构造方法,接口中不能有构造方法;
2. 抽象类中可以有普通成员变量,接口中没有普通成员变量(默认public static final );
3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的;
4. 抽象类中的抽象方法的可以是public,protected的,但接口中的抽象方法只能是public的;
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类中可以包含任意访问权限的静态成员变量,但接口中定义的变量只能是public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
二、思想层面
抽象类 在Java中体现了一种继承关系,要想使得继承关系合理, 抽象类 和派生类之间必须存在“is-a”关系,即
父类和子类在概念本质上应该是相同的。对于interface来说则不然,并不要求 interface的实现类和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约(模版)而已。
总结来说:
抽象类与子类为"is a"关系,它抽象出事物的共同本质特征,可单一继承;
接口与实现类为"like a"关系,它定义并规范了个性化的功能特征,可多重继承(实现)。
而且因为Java的单继承性使得,一个类不能从另一个类继承太多的方法。因此这种情况应该使用接口,用接口来定义很多方法,方便类实现这些方法。
当一个类实现了一个接口,那就说明它把接口里的方法都实现了-也就是说类里有接口里的所有的方法,因此占用了很大的资源空间,不管它有没有使用这些方法。
但是当一个类继承抽象类的时候,加入这个类没有调用父类的方法或没有重写这些方法,那这个类就不会实现这些方法,也就是说省了很大的空间。
基于这个特性,出来了一个非常常用的模式-缺省适配器模式。
两者相似之处在于:抽象类和接口都不能被实例化,两种都是java实现抽象的方式。不同之处分两个方面:
一、语法层面
1. 抽象类可以有构造方法,接口中不能有构造方法;
2. 抽象类中可以有普通成员变量,接口中没有普通成员变量(默认public static final );
3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的;
4. 抽象类中的抽象方法的可以是public,protected的,但接口中的抽象方法只能是public的;
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类中可以包含任意访问权限的静态成员变量,但接口中定义的变量只能是public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
二、思想层面
抽象类 在Java中体现了一种继承关系,要想使得继承关系合理, 抽象类 和派生类之间必须存在“is-a”关系,即
父类和子类在概念本质上应该是相同的。对于interface来说则不然,并不要求 interface的实现类和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约(模版)而已。
总结来说:
抽象类与子类为"is a"关系,它抽象出事物的共同本质特征,可单一继承;
接口与实现类为"like a"关系,它定义并规范了个性化的功能特征,可多重继承(实现)。