接口与抽象类的区别

1、定义不同
接口的定义:
interface 接口名 {
方法声明的定义;
}
抽象类的定义:
abstract class 类名 {
}

2、成员变量不同
接口中:
只能是常量,不能是变量
抽象类:
可以定义变量,也可以定义常量,但是不能被抽象

3、有无构造方法不同
接口中没有构造方法(因为不需要定义变量)
抽象类中有构造方法(仍然无法创建对象,主要用于被子类重写)

ps:有没有构造方法,不取决与是否可以创建对象,而是取决于是否可以定义成员变量

4、成员方法不同
接口中只能是抽象方法,1.8以后可以定义非抽象方法了
抽象类中既可以是抽象方法,又可以是非抽象方法。

理解/记忆方法:

java跟c++很像,所以有很多共性。在c++中,原本没有接口,采用的是用一个类可以从多个类派生。这就会出现问题了,如果有两个类,里面都有a()这个方法,那用哪个呢?这就是二义性。
于是接口出现了,它被用来对类的行为(方法)进行约束,因为它里面只能放抽象方法,并没有这个方法的具体实现,所以并不会产生冲突。

我们从我们实际设计场景中来切入这个话题
先来举一个简单的例子:狗都具有 eat() 、sleep() 方法,我们分别通过抽象类和接口定义这个抽象概念 //通过抽象类定义

public abstract class Dog {
  public abstract void eat();
  public abstract void sleep();  
   }

//通过接口定义

public interface Dog {
  public abstract void eat();
  public abstract void sleep();
  }

但是我们现在如果需要让狗拥有一项特殊的技能——钻火圈 DrillFireCircle(),如何增加这个行为呢?

思考:
将钻火圈方法与前面两个方法一同写入抽象类中,但是这样的话,但凡继承这个抽象类狗都具有了钻火圈技能,明显不合适将钻火圈方法与前面两个方法一同写入接口中,当需要使用钻火圈功能的时候,就必须实现 接口中的eat() 、sleep() 方法(重写该接口中所有的方法)显然也不合适 那么该如何解决呢 ?
我们可以仔细想一想,eat和sleep都是狗本身所应该具有的一种行为,而钻火圈这种行为则是后天训练出来的,只能算是对狗类的一种附加或者延伸, 两者不应该在同一个范畴内,所以我们考虑将这个单独的行为,独立的设计一个接口,其中包含DrillFireCircle()方法, Dog设计为一个抽象类, 其中又包括eat() 、sleep() 方法.

作者:BWH.Steven
链接:https://www.zhihu.com/question/20149818/answer/704355929
来源:知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值