常见的猫狗案例 猫和狗它们仅仅提供一些基本功能。java
但有一些不是动物自己就具有的,好比:猫钻火圈,狗跳高等功能设计
是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。code
[public] interface 接口名{ }
接口中的方法不能具体实现,接口中的方法必须为抽象方法继承
接口中通常不定义变量,由于接口中的变量会被默认指定为 public static final 变量(只能是)接口
class 类名 implements 接口1,接口2,[....]{ }
1.一个类(非抽象类)能够遵循多个接口,而且须要实现(重写)该接口中全部的方法ci
2.子类为抽象类的意义不大class
只能是常量
默认修饰符:public static final变量
没有构造方法方法
只能是抽象的im
默认修饰符:public abstract
咱们从咱们实际设计场景中来切入这个话题
先来举一个简单的例子:
狗都具备 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() 方法.
一个SpecialDog便可继承Dog类而且实现DrillFireCircle()接口
下面给出代码:
//定义接口,含有钻火圈方法 public interface DrillFireCircle() { public abstract void drillFireCircle(); } //定义抽象类狗类 public abstract class Dog { public abstract void eat(); public abstract void sleep(); } //继承抽象类且实现接口 class SpecialDog extends Dog implements drillFireCircle { public void eat() { //.... } public void sleep() { //.... } public void drillFireCircle() () { //.... } }
继承是一个 "是否是"的关系,而 接口 实现则是 "有没有"的关系。若是一个类继承了某个抽象类,则子类一定是抽象类的种类,而接口实现则是有没有、具有不具有的关系,好比狗是否能钻火圈,能则能够实现这个接口,不能就不实现这个接口。
若是内容中有什么不足,或者错误的地方,欢迎你们给我留言提出意见, 蟹蟹你们 !^_^
若是能帮到你的话,那就来关注我吧!
在这里的咱们素不相识,却都在为了本身的梦而努力 ❤
一个坚持推送原创Java技术的公众号:理想二旬不止