A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Y_Y 中级黑马   /  2013-10-26 23:11  /  1501 人查看  /  7 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

使用抽象类提高代码的复用性,可是接口有什么作用,直接在子类里实现就好,为什么还要接口?使用接口他不会多占用内存吗?

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

7 个回复

正序浏览
大家的回答太精彩了,收藏,留着看
回复 使用道具 举报
我给你总结下接口:
    格式:interface() {}
    接口的出现将“多继承”通过另一种形式现实,即“多实现”。
    可以理解为一个特殊的抽象类,当类中的方法都是抽象的,该类可以通过接口的形式来表示。接口中的方法都是没有方法体的,便于以后的覆盖。
    class用于定义类,interface用于定义接口。都产生class文件。
    接口定义时的结构特点:
    1. 接口中常见定义:常量和抽象方法。
    2. 接口中的成员都有固定修饰符:
      成员常量:例如,public static final int NUM = 3;
      成员函数:例如,public abstract void show();
    接口中的成员都是public的。只要是接口内的成员,public static final abstract这些关键字自动添加,修饰符是固定的。最好写全。不能创建对象。
    类与接口之间是“实现”关系,implements。父类中有非抽象内容可以直接拿来用,子类只有将接口中的内容全部实现后才能实例化,否则是抽象类。接口是不可以创建对象的,因为有抽象方法。覆盖接口中的方法必须用public,因为接口中的方法都是共有的。抽象类的权限不确定。
    接口可以被类多实现。一个类可以同时现实多个接口。也是对多继承的不支持的补偿。依然需要覆盖每个接口的方法。即使多个接口有相同名称的方法也没有问题,因为没有方法体,不会产生矛盾,子类可以全部覆盖。
    子类在继承父类的同时,还是实现多个接口。
    类之间是继承关系;类和接口之间是实现关系;接口之间是继承关系;接口之间可以多继承,但是不能有重载函数。

    接口的特点
    1. 接口是对外暴露的规则。
    2. 接口是程序的功能扩展。体系以外的功能扩展。
    3. 接口可以用来多实现,降低了耦合性。
例如,主板上的插槽就是对外暴露的规则,符合规则的内存条、CPU等都可以插上使用,扩展了主板的功能,同时降低了CPU和主板的关系,即耦合性(紧密联系程度)只要符合就能一起工作,同一个CPU可以插在不同的主板上使用。接口类似这些插槽。模块化开发。
    接口与类之间是实现关系;类可以继承一个类的同时再实现多个接口。
    接口与接口之间是继承关系。

    使用思路:
    子类继承父类的全部功能;但是,有的子类需要某些功能,有的子类不需要某些功能,可以将这些功能作为接口,需要的用,不需要的不用,防止不需要的子类也带上这些功能,而且其他的子类也可以使用这些接口;如果所有的子类都需要这些功能,但是具体的内容不同,可以使用抽象类,子类自己进行覆盖,或者使用一般类,少部分的子类通过覆盖获得自己所需要的功能。
    不同体系之间,基本功能和扩展功能有不同,例如,学生和运动员。基本功能定义在类中,扩展功能定义在接口中。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
Y_Y 来自手机 中级黑马 2013-10-27 00:03:08
板凳
接口的最主要的作用是达到统一访问,就是在创建对象的时候用接口创建,【接口名】 【对象名】=new 【实现接口的类】,这样你像用哪个类的对象就可以new哪个对象了,不需要改原来的代码,就和你的USB接口一样,插什么读什么,就是这个原理。就像你问的,都有个method1的方法,如果我用接口,我上面就可以one.method1();是吧?那样我new a();就是用a的方法,new b()就是用b的方法 这样不方便吗? 这个就叫统一访问,因为你实现这个接口的类的方法名相同,但是实现内容不同 我用接口来定义对象不就可以做到统一访问了吗?接口主要针对多个类实现它来说的,要是只有一个类当然可以不用接口了.你这样想,我做一个USB接口,有个read()抽象方法,然后mp3类实现,U盘类实现,移动硬盘类实现,这样我用的时候用USB a=new 【类名】;这样a.read();要是我类名里写U盘,就读U盘,写mp3就读mp3,而这个名字可以从属性文件里读,你写哪个就用哪个了,呵呵。

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
你说的“在子类里实现”,换个角度考虑下,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?
既然不是一个类去实现,那就是有很多地方有用到,大家需要统一标准。甚至有的编程语言(Object-C)已经不把接口叫 interface,直接叫 protocol。

统一标准的目的,是大家都知道这个是做什么的,但是具体不用知道具体怎么做
比如说:
我知道 Comparable 这个接口是用来比较两个对象的,那么如何去比较呢?
数字有数字的比较方法,字符串有字符串的比较方法,学生(自己定义的类)也有自己的比较方法。

然后,在另外一个负责对象排序(不一定是数字)的代码里面,肯定需要将两个对象比较。
这两个对象是什么类型呢?
Object a,b?肯定不行,a > b 这样的语法无法通过编译。
int a,b?也不行?一开始就说了,不一定是数字。
....
所以,Comparable 就来了。他告诉编译器,a b 两个对象都满足 Comparable 接口,也就是他们是可以进行比较的。具体怎么比较,这段程序不需要知道。
所以,他需要一些具体的实现,Comparable 接口有一个方法,叫 compareTo。那么这个方法就是用来取代 <、> 这样的运算符。
因为运算符是编译器保留给内置类型(整数、浮点数)进行比较用的,而不是一个广义的比较运算。

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

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张运 于 2013-10-26 23:35 编辑

Java是一种单继承的语言,一般情况下,哪个具体类可能已经有了一个超类,解决是给它的父类加父类,或者给它父类的父类加父类,只到移动到类等级结构的最顶端。这样一来,对一个具体类的可插入性的设计,就变成了对整个等级结构中所有类的修改。而接口为插入性提供可可能:
好处我认为:
1.解决了java中不能多继承的问题,
2.可以提供可插拔的功能的扩展。
3.在实际开发中,可以解决代码层与层之间的耦合性问题。
至于你说的占用内存的问题。接口是不能创建实例的,他只能创建一个栈内存的引用指向实现他的子类,也就是说他并不耗费堆内存。

点评

不行,我也要mark一下,留着看!  发表于 2013-10-26 23:42
答案真好,我要mark一下,留着看!  发表于 2013-10-26 23:34

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马