接口】【Java基础】java接口的作用和意义

2020-12-27 15:23发布

9条回答
天天
2楼 · 2020-12-27 15:33

1、定义接口的重要性:在Java编程,abstract class 和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才使得Java成为面向对象的编程语言。

2、定义接口有利于代码的规范:对于一个大型项目而言,架构师往往会对一些主要的接口来进行定义,或者清理一些没有必要的接口。这样做的目的一方面是为了给开发人员一个清晰的指示,告诉他们哪些业务需要实现;同时也能防止由于开发人员随意命名而导致的命名不清晰和代码混乱,影响开发效率。

3、有利于对代码进行维护:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。可是在不久将来,你突然发现现有的类已经不能够满足需要,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。

4、保证代码的安全和严密:一个好的程序一定符合高内聚低耦合的特征,那么实现低耦合,定义接口是一个很好的方法,能够让系统的功能较好地实现,而不涉及任何具体的实现细节。这样就比较安全、严密一些,这一思想一般在软件开发中较为常见。


小小123
3楼 · 2020-12-27 17:02

abstract class 和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才使得Java成为面向对象的编程语言。

魏魏姐
4楼 · 2020-12-28 10:37

JAVA中的接口有什么作用?java的接口(interface)是一系列方法的声明,而且这些方法只有基本的特征而没有具体的实现代码。它可以被很多类实现(implements)。 接口可以让很多类来实现,而且一个类可以实现多个接口。这样让类与方法分离,通过接口来连接,可以大大提高代码的重用性,同时易于对代码进行修改。 至于它和抽象类的区别,简单来说,接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.

楠楠楠楠
5楼 · 2020-12-28 14:17

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

接口作用如下:

1、丰富Java面向对象的思想:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。

2、提供简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。

3、提高维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类,可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦,如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。

4、增强安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。


熊晓燕
6楼 · 2020-12-29 17:00

abstract class 和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才使得Java成为面向对象的编程语言。

我的网名不再改
7楼 · 2021-01-03 14:00

接口功能与特点

类型的统一与保护

  我们在编程的时候,会不断的创建出许多类,类的本质就是类型,随着类得种类越来越多,数据类型也变得越来越多。假如我们有个需求,需要统一管理某些类,我们很容易就能想到使用HashMap,处理键值对的好帮手。在没有接口的情况下,我们可以使用万物的基类ObjectHashMap,但是,问题也出在Object上,正是因为它的包容性,任何其他类类型的对象也可以存储到这个Map里,对这个Map进行捣乱。

  上述问题本质是因为“类型保护的缺失“而造成的。现在可以用接口很轻松的解决这个问题。定义一个接口,里面可以什么都不做。

public interface IMyType {
    }123

  在让你需要归为一类的类实现这个接口,它们就可以用这个接口进行统一了。HashMap,之后对于Map的操作,满足实现接口IMyType的类的对象才可以进入Map进行操作。

  是的,一个空空如也的接口作用都有这么大的作用!!!

  但是,有一个问题,只能对自己定义的类进行操作,而对已有的类,我们没有办法接触到源代码,不能更改就不启作用了。还是有办法的:新建一个类,继承这个内部工具类,实现所有的构造方法,并让这个类实现IMyType接口,以后用这个新类替代原来的内部工具类。但是对于一些final修饰的类(String)就没有办法了。


规范方法

  接口在使用中有一个强有力的规定:凡是实现了该接口的非抽象类,就必须实现这个接口所规定的所有抽象方法。正是因为这个规定十分严格,也就有了规范行为的意义。有如下规范。

  1. 接口的所有方法必须实现,一个都不能少

  2. 规范了方法的名称

  3. 规范了方法的参数个数以及类型

  4. 规范了方法的返回值

  但是,规范是规范,规定你必须这样做并不涉及方法的具体实现,这一点在swing编程的适配器(Adapter)有体现。


方法的公开

  同样是规范的作用,只不过这次看的角度不同,从应用角度看。如果我们已知一个接口,那么当我们遇到它的实现类后,我们就可以肆无忌惮的去调用接口里的方法,因为这个类一定实现了的。
  我们甚至不用关心这个类具体是什么,只要判定这个类的对象是接口的实例,就可以调用接口的方法。


分离原则

  假如我们有这么一种需求,对数据进行排序,而这些数据可能来源并不相同。有的可能来自键入,有的可能来自文件,有的可能来自网络,也可能来自数据库。

  首先可以写我们已知的数据排序类。

public class DataSort {

 private ArrayList dataList; //仅仅先假设我们处理的都是int数据

 public DataSort() {
 }
 
 public ArrayList getDataList() {
  return dataList;
 }

 public void setDataList(ArrayList dataList) { //如何set最初始的数据?
  this.dataList = dataList;
 }
 
 public void sort() {
  int temp;
  
  for (int i = 0; i < dataList.size(); i++) {
   for (int j = i +1; j < dataList.size(); j++) {
    int num1 = dataList.get(i);
    int num2 = dataList.get(j);
    if (num1 > num2) {
     temp = num1;
     dataList.set(i, num2);
     dataList.set(j, temp);
    }
   }
  }
  
 }
 }123456789101112131415161718192021222324252627282930313233

可以先写由键入来的数据。

public class DataFromScanner {
 
 public DataFromScanner() {
 }
 
 public ArrayList inputData() {
  Scanner sc = new Scanner(System.in);
  ArrayList dataSource = new ArrayList<>();
  int num;
  while (sc.hasNextInt()) {
   num = sc.nextInt();
   dataSource.add(num);
  }
  sc.close();
  return dataSource;
 }
 }123456789101112131415161718
public class Demo {

 public static void main(String[] args) {

  DataSort ds = new DataSort();
  DataFromScanner dfs = new DataFromScanner();
  ds.setDataList(dfs.inputData());
  ds.sort();
  ArrayList result = ds.getDataList();
  for (int i = 0; i < result.size(); i++) {
   System.out.print((i == 0 ? "" : ", ") + result.get(i));  
  }
 }}123456789101112131415

  经过实验可以正常排序。但是,如果来自其他的输入源怎么办?再写个DataFromNetDataFromFile吗?

Java面向对象思想终极目标是代码复用

  我们回过头再来考虑这件事,数据输入和数据排序的关系是什么呢?数据输入属于数据排序吗?其实,数据输入是数据排序必不可少的一项工作,因此应该把数据输入看作数据排序的一个成员。还是上面那个问题,是选择DataFromScanner作为成员呢?还是DataFromNet,还是DataFromFile?答案是都不是,但是需要它们全部,这又体现出接口的第一个功能了,统一起来用一个类型,接口类型

public interface IDataSource {

 ArrayList inputData();   //方法规定好是数据输入,至于你怎么输入我只规定,后来去实现}1234
public class DataSort {

 private ArrayList dataList;
 private IDataSource dataSource;  //数据输入作为数据排序的成员,且是接口类型,就可以从多个源获取数据了

 public DataSort() {
  dataList = new ArrayList<>();
 }
 
 public ArrayList getDataList() {
  return dataList;
 }
 
 public void setDataSource(IDataSource dataSource) {
  this.dataSource = dataSource;
 }

 private void setDataList() {
  if (dataSource == null) {
   return;
  }
  this.dataList = dataSource.inputData(); //因为相关实现接口的的类一定完成了这个方法,一定能得到想要的dataList
 }
 
 public void sort() {
  setDataList();//只要你把输入源头定好了,下一步可直接排序,因为输入数据是排序的一部分步骤
  int temp;
  
  for (int i = 0; i < dataList.size(); i++) {
   for (int j = i +1; j < dataList.size(); j++) {
    int num1 = dataList.get(i);
    int num2 = dataList.get(j);
    if (num1 > num2) {
     temp = num1;
     dataList.set(i, num2);
     dataList.set(j, temp);
    }
   }
  }
  
 }
 
 public void showList() {
  for (int i = 0; i < dataList.size(); i++) {
   System.out.print((i == 0 ? "" : ", ") + dataList.get(i));
  }
 }
 }12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
public class Demo {

 public static void main(String[] args) {

  DataSort ds = new DataSort();
  ds.setDataSource(new DataFromScanner());  //对于不同的数据源头只用改这里
  ds.sort();
  System.out.println("排序后:");
  ds.showList();
 }}123456789101112

在这里插入图片描述

接口的妙用

例子一

  在写多文件代码的过程中,对接口使用的理解。回看SectionTransfer的receiveSection里面接口处理(sectionProcessor),之所以用接口实现,是为了将功能分开,接收就是接收,接收后的具体处理的逻辑不希望在这体现。接收后的具体处理逻辑可以用其他类来实现,而实现时就可以更加专注一些。

例子二

  List的sort方法Comparator接口作为参数,这个接口实际上的意义是比较原则,比较原则对外开放,由外面写,这就使得List sort方法可以控制升序还是降序了。(这点很像我们C语言中学的指向函数的指针)


人情世故
8楼 · 2021-01-06 18:30

1、定义接口的重要性:在Java编程,abstract class 和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才使得Java成为面向对象的编程语言。

2、定义接口有利于代码的规范:对于一个大型项目而言,架构师往往会对一些主要的接口来进行定义,或者清理一些没有必要的接口。这样做的目的一方面是为了给开发人员一个清晰的指示,告诉他们哪些业务需要实现;同时也能防止由于开发人员随意命名而导致的命名不清晰和代码混乱,影响开发效率。

3、有利于对代码进行维护:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。可是在不久将来,你突然发现现有的类已经不能够满足需要,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。

4、保证代码的安全和严密:一个好的程序一定符合高内聚低耦合的特征,那么实现低耦合,定义接口是一个很好的方法,能够让系统的功能较好地实现,而不涉及任何具体的实现细节。这样就比较安全、严密一些,这一思想一般在软件开发中较为常见。


猫的想法不敢猜
9楼 · 2021-01-08 19:02

接口在java中就是一种规则,主要内容就是:

定义规则,也就是定义一个接口;

实现规则,也就是实现一个符合这种规则的功能,即实现类,子类;

使用规则,也就是使用符合这种规则的功能,即使用类。


相关问题推荐

  • 回答 4

    对于接口测试,首先测试人员要懂代码,你只需要知道接口的作用是什么就可以了,其次,自己去读开发的代码。然后,根据该接口功能及代码写测试用例:根据该接口参数,构造不同的用例,测试接口在参数合法及非法情况下能否达到预期效果,根据该接口中的逻辑,测...

  • 回答 5

    Http接口是互联网各系统之间对接的重要方式之一,使用http接口,开发和调用都很方便,也是被大量采用的方式,它可以让不同系统之间实现数据的交换和共享,但由于http接口开放在互联网上,那么我们就需要有一定的安全措施来保证不能是随随便便就可以调用;目前...

  • 回答 15

    java里最常用的是关键字,这些关键字可以说是程序中的关键,我都帮你整理出来哈关键字含义abstract表明类或者成员方法具有抽象属性assert断言,用来进行程序调试boolean基本数据类型之一,声明布尔类型的关键字break提前跳出一个块byte基本数据类型之一,字节...

  • 回答 15

    一、抽象类: (关键字abstract)java抽象类定义  在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。  抽象类除了不能实例化对...

  • 回答 14

    1、利于代码的规范这样做的目的一方面是为了给开发人员一个清晰的指示,告诉他们哪些业务需要实现;同时也能防止由于开发人员随意命名而导致的命名不清晰和代码混乱,影响开发效率。2、有利于对代码进行维护可以一开始定义一个接口,把功能菜单放在接口里,然...

  • 回答 6
    已采纳

    1、接口类似于类,但接口的成员都没有执行方式,它只是方法、属性、事件和索引的组合而已,并且也只能包含这四种成员;类除了这四种成员之外还可以有别的成员(如字段)。2、不能实例化一个接口,接口只包括成员的签名;而类可以实例化(abstract类除外)。3、接...

  • 回答 7

    第一步我们首先需要知道java中的接口指的是抽象方法的集合,一个抽象类型,一般以interface来声明,需要注意的是接口不是类第二步我们可以看一下接口声明的格式,接口中的抽象方法都是隐式的,所以声明不需要abstract关键字,接口中的变量只能是 public stati...

  • 回答 9

    1.java.lang.StringString类无可争议的获得冠军,应该没有人会否认这一点,这是一个最终类,用于创建/操作不可变的字符串文字。2.java.lang.SystemSystem类的使用取决于你工作的项目类型,你可能没有在项目中使用过它,但它仍然是受欢迎的Java类之一,这是一...

  • 回答 1

    需要启动网络服务

  • 回答 15
    已采纳

    这个其实和接口测试的场景密不可分的,比如说:外部接口测试:    必须先接口测试通过了,才能执行功能测试子系统或者各个模块之间的联调测试:    必须各子系统后台代码完成,并提供接口才可以完成测试,一般来说都要求各子系统功能测试通过后再进行...

  • 回答 2

    接口调用一般分为前端调用和后端调用。百度API有很多官方文档和接口说明,在调用时传入相对应的数据。如果在后端python代码中调用可以借助:requests模块实现。requests模块主要用于模拟浏览器进行访问。也可以用于请求某些接口获取数据。...

没有解决我的问题,去提问