博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于接口的简单理解
阅读量:5964 次
发布时间:2019-06-19

本文共 1863 字,大约阅读时间需要 6 分钟。

hot3.png

第五章 接口

5.1 接口概述

常见的猫狗案例 猫和狗它们仅仅提供一些基本功能。

但有一些不是动物本身就具备的,比如:猫钻火圈,狗跳高等功能

是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。

5.2 接口特点

A:接口用关键字interface表示

[public] interface 接口名{}
  1. 接口中的方法不能具体实现,接口中的方法必须为抽象方法

  2. 接口中一般不定义变量,因为接口中的变量会被默认指定为 public static final 变量(只能是)

B:类实现接口用implements 表示

class 类名 implements 接口1,接口2,[....]{}

1.一个类(非抽象类)可以遵循多个接口,并且需要实现(重写)该接口中所有的方法

2.子类为抽象类的意义不大

5.3 接口的成员特点

A:成员变量
只能是常量

​ 默认修饰符:public static final

B:构造方法

​ 没有构造方法

C:成员方法

​ 只能是抽象的

​ 默认修饰符:public abstract

5.4 抽象类和接口的区别(重要)

我们从我们实际设计场景中来切入这个话题

先来举一个简单的例子:

狗都具有 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(),如何增加这个行为呢?

思考:

  1. 将钻火圈方法与前面两个方法一同写入抽象类中,但是这样的话,但凡继承这个抽象类狗都具有了钻火圈技能,明显不合适

  2. 将钻火圈方法与前面两个方法一同写入接口中,当需要使用钻火圈功能的时候,就必须实现 接口中的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技术的公众号:理想二旬不止

转载于:https://my.oschina.net/u/4138117/blog/3057899

你可能感兴趣的文章
三家公司在SD-WAN方面的新动作
查看>>
C#在PDF中如何以不同颜色高亮文本
查看>>
在同一页面显示多个JavaScript统计图表
查看>>
Mac电脑Tomcat下载及安装(详细)MAC在Eclipse里配置tomcat
查看>>
多线程之-----------定时器
查看>>
C#语法——反射,架构师的入门基础。
查看>>
Beego Models 之 一
查看>>
代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能
查看>>
Kubernetes部署的最佳安全实践
查看>>
理解C语言——从小菜到大神的晋级之路(8)——数组、指针和字符串
查看>>
Windows Shellcode学习笔记——shellcode在栈溢出中的利用与优化
查看>>
关于多线程中使用SendMessage
查看>>
【云栖大会】阿里云移动云Apsara Mobile重磅发布 推出Cloud Native App全新研发范式...
查看>>
【PMP】Head First PMP 学习笔记 第九章 人力资源管理
查看>>
2015年末必备前端工具集
查看>>
【Solidity】8. 杂项 - 深入理解Solidity
查看>>
关于在VS2005中编写DLL遇到 C4251 警告的解决办法
查看>>
Go语言大神亲述:历七劫方可成为程序员!
查看>>
CYQ.Data 轻量数据层之路 V4.5 版本发布[更好的使用体验,更优的缓存机制]
查看>>
NetApp针对其集群化方案“不值得升级”言论回击Wikibon
查看>>