Java中接口作用的理解

关于Java中接口作用的深入理解。这是个很容易遇到的问题吧,看下面红色的部分应该就能理解了。


/ 2019/3/1 补充 : 接口的存在也是为了弥补类无法多继承的缺点,假设一个情况,父类--Animal  子类--Dog、Cat 、People、Sheep、Tiger、Lion。假设在 Animal 中都存在 eat()这个公有的方法。但是  Tiger 和  Lion 、People 还拥有  Hunt  的方法,但是hunt 不存在在 Dog / Cat中,所以需要对  Tiger Lion  People 上面新建一个 接口。用于特定标识他们公有的。

------- 其实上面的情况还有种方法解决 : 即在 父类下面再写一个三者的父类,加入新的动作,但是,这样五者不是在同一级上面的了,代码结构混乱,所以引入了接口。而在面向对象的Python语言中是允许多继承的。   总之,引入抽象类和接口是为了是代码逻辑更加清晰,建议去看一些简单的jdk源码,然后根据源码自己画一个类的UML图,理解一下平时所有的集合框架List Set这些的整体结构。


2019/3/22 补充 : 接口在扩展性方面的体现 : 类 B  调用了  接口 A里面的一个方法,但是这个方法在当前提供的 jar 里面并没有接口的实现类 , 而接口的实现类需要通过外部的添加才可以。 那么我只需要通过反射的方式加载外部特定的 jar 包,即可实现不同的方法。就是类似于  A 的接口方法并没有具体实现,而我调用A中某个方法,最终调用的 看我外部加载的什么样子的实现类 。 充分体现了 解耦的特性 。 这里的一个很明显的体现就是  使用  JDBC 的时候,需要从外部加载驱动 。。。Class.forName("com.mysql.jdbc.Driver"); ,但是我也可以加载其他的驱动,比如 SSH 框架里面的。体现了一种拔插的思维。


2019/4/26 补充: 今天在看 JDBC 源码的时候,发现第一句 的 class.forName(),做了很多的事情, 在jdk 中,只有  Driver 的一个接口,但是  mysql-connector-java.jar 这种类似的 jar 需要第三方去实现,  具体的Driver 实现类是在第三方的jar里面的,比如肯定还有 oracle的connector的jar。  这样就充分体现了扩展性,我在 class.forName 里面,指定加载 第三方的 Driver,那么在类加载的时候,可以完成 jdk 中 Driver 接口, 在 第三方jar 中具体实现的class,但是 我们知道就算知道接口也不行,因为在 jdk 中只有一个接口, 所以在 第三方 的jar里面,存在一个 配置文件,指向了在 第三方 jar 中具体实现了 jdk 中 sql 包下的 Driver 接口的 类,这样就可以通过反射的方式,获取到 第三方中具体实现类。   是不是 接口的 扩展性 非常的明显。  我只需要写接口,具体实现交给其他人去做,然后我使用的时候,只需要显示的加载某一个特定类,就可以获取到接口的实现类了。


1、首先是关于接口的疑问:

为什么要使用接口?接口的作用是什么?为什么不直接在实例类中进行方法实现,而是需要首先进行接口的定义?是不是多此一举了?

2、其次是关于接口的使用规范:

1、接口中可以定义常量,不能定义变量,如果你在接口中定义属性,那么通过反编译可以看见他会自动用public static final 修饰,接口中的属性都是全局静态常量,接口中的常量必须在定义时指定初始值。

2、 接口中所有的方法都是抽象方法,接口中方法都会自动用public abstract 修饰,即接口中只有全局抽象方法。

3、 接口不能实例化,接口中不能有构造。

4、 接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。

5、 接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。

3、然后我们回答一下开始提出的问题:

 

2    接口的作用是什么?

笔者认为接口是一种协议。例如两个开发者,开发时间完全不一致,那么需要两个人的配合开发,则需要一个人讲接口写好,定义好其中所有的变量命名规范、函数定义规范。具体实现类的开发人员则只需要按照接口实现相应功能即可。

 

3、 为什么不在一个类是直接实现相应的方法,而是需要先进行接口抽象?

①首先是关于全局变量的定义,目的已经很清楚了。

②其次是说明一下接口的真正作用是建立在很多的对象类、并且类同时拥有很多的方法(需要实现的功能)。这种情景下,使用接口可以非常明显的感觉到接口的作用。

 

下面举例:

 

例如:海 、陆、 空  三种生活的动物类型,三种分别可以实现的功能是:

海:游泳、捕猎水生动物、长时间憋气

 

 

陆:走、跑、跳、爬、捕食、交流

空:飞、捕食空中动物、鸣叫、

 

划重点:以上就应该是我们需要定义的接口。高度抽象化的没有具体实现的方法。

 

 

Java中接口作用的理解_第1张图片

 

Java中接口作用的理解_第2张图片

 

Java中接口作用的理解_第3张图片

 

现在有这些确定的需要实例化的对象类

人类(海、陆)

鱼(海)

鳄鱼(海、陆)

鸟(陆、空)

 

 放出一个实例化  人类   对象源码,具体实现省略:

 

package interfacedemo;

public class Human implements Ocean,Land{

	public Human() {
	}

	@Override
	public void run() {
	}

	@Override
	public void jump() {
	}

	@Override
	public void walk() {
	}

	@Override
	public void landCatch() {
	}

	@Override
	public void communicate() {
	}

	@Override
	public void swim() {
	}

	@Override
	public void oceanCatch() {
	}

	@Override
	public void breath() {
	}

}

 

 

那么现在如果实例化对象的时候,不使用接口的方法。如果开发者很明确需求的情况下,问题不大。但是需求是其他人负责的话,那么可以你无法实现所有要求的方法。第二,如果不使用接口的方法,对于这几个类之间的关系是不清楚的。(可以自己举其他例子,而不去抽象出接口尝试一下)。

 

4、最后讲一下使用接口的好处:

①全局变量定义

②如同上面的例子,我们去实现接口后,能够很明显清楚各个类具体实现类之间的关系,如果将自己的代码交给别人看的时候,他只需要看你所定义的接口就知道了你的类具体是干嘛的。换言之,你看别人的代码,如果别人的代码也是这样定义的,那么是不是改别人代码、看懂别人代码也容易很多了。所以,在之前笔者就说过:接口更像是一种定义的规范。

 

推荐的 关于 接口的文章: https://blog.csdn.net/nvd11/article/details/41129935

 

你可能感兴趣的:(Java)