抽象类与抽象接口之两者区别

前面简单的介绍了抽象类抽象接口(不说抽象也得是抽象的),现在侧重介绍一下两者的区别。先通过代码来了解两者语法上的区别:

interface In{ //没有用abstract修饰 int i = 0; public long j = 0; final int k = 0; static double l = 0; public static final int m = 0; private int n = 0; //不能有private变量 protected int q = 0; //不能有protected变量 void changeValue(int i){ // 有具体方法体,报错 i = 1; } void changeValue(long l); //没有abstract修饰,没有错 abstract void changeValue(double d); } abstract class Out{ //必须用abstract修饰 int i = 0; public long j = 0; final int k = 0; static double l = 0; public static final int m = 0; private int n = 0; //可以有private变量 protected int q = 0; //可以有protected变量 void changeValue(int i){ //有具体方法体,没有错 i = 1; } void changeValue(long l); //没有abstract修饰,报错 abstract void changeValue(double d); }

上面的一些正确和错误的代码基本涵盖了两者在语法上面的细微区别,通过以上的代码可以看出,interface是一种更加特殊的抽象类(抛开其他区别)。

下面在来看看再编程的时候,两者的区别,也就是在使用的选择上两者有什么区别。都知道Java只支持单继承,所以接口的存在对于这点不足是个很好的补充,所以,这是一点区别,但一个具体类可以实现多个接口,但只能继承一个类。另外一点,接口无法集成一个类,因为接口必须是接口,但是类可以;但一个类可以实现一个接口,而且要实现该接口的所有方法。当一个类要继承一个抽象类的时候,可以不实现该抽象类的所有抽象方法,但该类必须付出代价,那就是它也必须是抽象类;当一个接口继承一个接口的时候,它可以不用实现父接口的抽象方法,但是如果有一个类要实现该子接口,则必须实现父接口和子接口所有的抽象方法。

另外,有一个观点就是:接口是对行为的抽象;抽象类是对类的抽象,而类包含属性、方法(行为)、事件。所以从这个意义上讲,类和接口也就有了契合点,也就有所区别。当你面对点-线-面这种抽象的时候,你可能会选择利用抽象类来进行设计;当面对形如Comparable或者Iterable这种侧重抽象方法的问题时,则要考虑接口多一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值