大家好,又见面了,我是你们的朋友全栈君。
关于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 接口(interface)的用途和好处_nvd11的专栏-CSDN博客_java接口的作用和意义
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145121.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...