例如我定义了一个接口,但是我在继承这个接口的类中还要写接口的实现方法,那不如直接就在这个类中写实现方法岂不是更便捷?在java中为什么要引入接口
2015-04-13 21:28:12 最后修改,2015-04-13 21:35:38

7 Answers

“不如直接就在这个类中写实现方法岂不是更便捷”,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?


既然不是一个类去实现,那就是有很多地方有用到,大家需要统一标准。甚至有的编程语言(Object-C)已经不把接口叫 interface,直接叫 protocol。


统一标准的目的,是大家都知道这个是做什么的,但是具体不用知道具体怎么做。

比如说:

我知道 Comparable 这个接口是用来比较两个对象的,那么如何去比较呢?

数字有数字的比较方法,字符串有字符串的比较方法,学生(自己定义的类)也有自己的比较方法。


然后,在另外一个负责对象排序(不一定是数字喔)的代码里面,肯定需要将两个对象比较。

这两个对象是什么类型呢?

Object a,b?肯定不行,a > b 这样的语法无法通过编译。

int a,b?也不行?一开始就说了,不一定是数字。

....

所以,Comparable 就来了。他告诉编译器,a b 两个对象都满足 Comparable 接口,也就是他们是可以进行比较的。具体怎么比较,这段程序不需要知道。

所以,他需要一些具体的实现,Comparable 接口有一个方法,叫 compareTo。那么这个方法就是用来取代 <、> 这样的运算符。

因为运算符是编译器保留给内置类型(整数、浮点数)进行比较用的,而不是一个广义的比较运算。


如果你可以明白 JDK 自身库里面诸如 Comparable 这样已经有的接口,那么就很容易理解自己在开发程序的时候为什么需要用到接口了。

2015-04-13 21:29:39

说白了就是抽象,规范,回调!接触过框架设计就懂了,当设计大的应用框架时,难免会出现代码耦合,而我们要做的就是让耦合出现在接口上,这样有利用框架的拓展和维护!也就所谓的面向接口编程。看看设计模式也可以加深你的认识!

2015-04-13 21:30:28
接口在开发过程中可以快速分离工作内容。
比如调用者在写业务逻辑的时候需要一个功能,可能是数据库访问,或者复杂计算,但是他的工作专注于实现业务逻辑,不想分开精力去做底层实现,那么他只需要先实现一个接口,定义了规范,然后就可以继续他的业务逻辑代码了。
而实现者可以根据这个接口规范,做具体的实现。
这样通过使用接口就可以快速的分离工作内容,达到团队并行工作的目的。

此外,如果规范是通过接口定义的,那么当你这个功能有多个实现时,你只要实现了这个接口,那么可以快速的替换具体实现,做到代码层面的完全可以分离。

总结起来就一句话:接口或者规范可以在开发过程中做到分离。
2015-04-13 21:31:53


1 interface的作用是让使用inerface的人不知道它是怎么实现的,但调用这结方法就好使。就像是收歀台,它的方法就是收钱。你把钱给它,它给你零钱。你不用管它用的是电脑还是算盘。它也不想让你知道。反正功能实现了。

2 当你在使用inerface时,一定是用的implements里的方法,而且经常这么用。List l = new ArrayList() ; List是接口,ArrayList是它的实现。这后还很有可能有个方法是这样的 public void m1(List l){...}.这里写List是让这个方法更通用些,只要是List 的实现就能用。就好比这个款台,台子是一样的,但钱可以不一样。可是美元,也可以是元宝。但它们都是“钱”的实现,“钱”本身没有意义。

3 implements 和 extends 。implements是向老师学习,我可以拜很多的人为师,从而我就有了这些人的本领,但我还是我,不过本事大了些;extends 就是认爸爸。一个人就一个爸,同样我有了爸爸的本领,你可以替你爸去从军,但不能替别的老头子,我也不能再认别的爸了,但可以认老师,几个都没关系。这之间也许还有别的区别,不过我还没遇到过。

 还有一些,我也说不来了。我还分不太清什么时候用接口或是抽象类,不过我用接口的情况多些。有人对我说,最好是一个类对应一个接口,我还不理解它的意义有多大,不过大家都是这么写的。换句话说,一个类好不要凭空就出来,最差也要继承个抽象类。这都是书本上的,记住了,但没什么感觉。

  以上只是我的一点认识,用的都是土话,仅供参考。

2015-04-13 21:29:24
由于java是单继承的,但是很多时候我们都需要多继承,所以才有了接口这个概念
2015-04-13 21:31:32

接口的作用对于很多新手来说很不容易理解,我给大家举个例子。

接口只是一个规范,所以里面的方法都是空的。

假如我开了一个宠物粮店,声明所有宠物都可以来我这里买粮食,这就相当于一个接口,


public interface PetRestaurant {

public void buy();

}


当一只狗看到了,知道自己是宠物,所以它去实现这个接口

public class DogPet implements PetRestaurant {

@Override

public void buy() {

System.out.println("我是狗,我要买狗粮");

}

}

当一只猫看到了,知道自己也是宠物,所以也去实现这个接口

public class CatPet implements PetRestaurant {

@Override

public void buy() {

System.out.println("我是猫,我要买猫粮");

}


}

当狗和猫来我的店之前,我是不知道他们到底是什么,但是当他们来到我的店,我就知道一个要猫粮食,一个要狗粮食。因为他们都实现了 我这个接口,都可以买。下面这个类相当于一个接待顾客的类,即店小二,他接待所有实现了我这个宠物店接口的动物,传进来一个PetRestaurant 类型的宠物,注意,这个PetRestaurant 是接口

public class test {

public void buy(PetRestaurant pet)

{

pet.buy();

}

}


好了,这个时候我这个老板出现了,我可以给他们卖粮食了,相当于测试类

public class Tests {

public static void main(String[] args) {

PetRestaurant dog = new DogPet(); //实例化一个狗,相当于把狗顾客实例化

PetRestaurant cat = new CatPet();//实例化一个猫,相当于把猫顾客实例化


test t = new test(); //实例化一个店小二

t.buy(cat); //把猫交给店小二

t.buy(dog); //把狗交给店小二

}


}

这样运行的结果就是

我是猫,我要买猫粮

我是狗,我要买狗娘


你知道吗,整个过程我这个店主其实根本不知道来的到底是猫是狗还是其他什么,我只要有一个店小二,把这些来的不知什么动物都全部交给店小二,店小二就知道怎么去卖了,因为这些狗啊猫啊都实现了我这个宠物店的接口,而店小二就负责接待所有实现了我这个接口的动物。这就有一个好处,假如明天来了一头小猪,只要它实现了我这个接口,我只管交给店小二处理就OK了,我这个店小二根本不需要变化,我这个店主也只需要实例化一下这个动物就OK

你想,假如没有接口,会怎么办,来一个猫,我要去创造一个猫,还要实例化,来一只狗,我要创建一只狗,同样要实例化,还要配备专门的店小二去接待,就会相当麻烦

2015-04-13 21:30:09
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制