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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨政 中级黑马   /  2012-10-20 11:40  /  1722 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

interface、 abstract class在什么时候用?特别是abstract class,不知道什么时候用

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

6 个回复

倒序浏览

interface从表面上看,和抽象类很相似,但用法完全不同。它的基本功能就是把一些毫不相关的类(概念)集合在一起形成一个新的、可集中操作的“新类”。我给学生的一个典型例子就是“司机”。谁可以当司机?谁都可以,只要领取了驾照。所以我不管你是学生,白领、蓝领还是老板,只要有驾照就是司机。
  1. interface Driver {
  2. Licence getDriverLicence();
  3. }

  4. class StudentDriver extends Student implements Driver {
  5. }
  6. class WhtieCollarEmployeeDriver extends WhtieCollarEmployee implements Driver {
  7. }
  8. class BlueCollarEmployeeDriver extends BlueCollarEmployee implements Driver {
  9. }
  10. class BossDriver extends Boss implements Driver {
  11. }
复制代码
当我定义了“汽车”类后,我就可以指定“司机”了。
  1. class Car {
  2. setDriver(Driver driver);
  3. }
复制代码
这时候,Car的对象并不关心这个司机到底是干什么的,他们的唯一共同点是领取了驾照(都实现了DriverLicence接口)。这个,应当是接口最强大的地方也是抽象类无法比拟的。

  抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是我关心的重点。 ”

评分

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

查看全部评分

回复 使用道具 举报
首先,一个类可以实现多个接口,但是只能继承一个类,即单继承

举个例子:
interface:江湖上有许多武功,降龙十八掌,一指禅,九阴真经,一种武功你就可以把它看做一个接口,你想修炼哪个功夫就想当于去实现某个接口,这些功夫之间没有什么联系,而且你想修炼哪个就修炼哪个。

abstract class:就相当于你是少林寺门派里的一个徒弟,作为门派里的弟子,你必须要修炼本门派里所有的武功,即实现父类中的abstract方法,还可以复写父类的一般方法,但是你也可以修炼其他功夫,即去实现其他的接口。

所以,总结一下,武功可以随便学,但是门派不可以随便改,不然:身在江湖漂,天天都挨刀!!

回复 使用道具 举报
本帖最后由 sun~~ 于 2012-10-20 14:07 编辑

    声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
    接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
首先是接口程序实例:
1.public interface iFoo1{   
2.        //做a+b计算返回结果   
3.        int doPlus(int a, int b);   
4.    }   
5.  
6.    public interface iFoo2{   
7.        //做a-b计算返回结果   
8.        int doMinus(int a, int b);   
9.    }   
10.  
11.    public Impl implements iFoo1,iFoo2{   
12.        public int doPlus(int a, int b){   
13.            return a+b;   
14.        }   
15.        public int doMinus(int a, int b){   
16.            return a-b;   
17.        }   
18.        .....   
19.    }  
抽象类实例,注意抽象类中,一个子类只能继承一个父类
1.public abstract class absFoo{   
2.        public void doCommon(){   
3.            .......   
4.        }   
5.        public abstract int doSomething();   
6.    }   
7.  
8.    public class Foo extends absFoo{   
9.        public int doSomething(){   
10.            int res=0;   
11.            ....   
12.            return res;   
13.        }   
14.    }  

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
interface用来定义借口,供其他地方引用。
abstract class是抽象类,一般用在不希望被实例化的类上。
回复 使用道具 举报
抽象类和接口都可以被继承,不同的是,接口内的方法不能实现,需要继承的类来具体实现其方法,而抽象类中的方法可以被具体实现,并且继承的类可以重写其方法。一个类可以继承一个抽象类,但是可以继承多个接口。通常,接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法,而抽象类更倾向于充当公共类的角色。不适于在日后重新对里面的代码进行修改。
回复 使用道具 举报
interface就是接口,他其实是把一类事物的共性方法全部抽取出来而成的,比如:狗和狼都属于动物,都会吃方法,但不管吃啥,所以就把吃的方法抽取出来作为一个共性方法,只要属于动物都得实现叫这个方法。其余额外方法就和动物无关了,就是特有方法了。
abstract class是抽象类,它内部含有抽象方法和非抽象方法,比如:狗和狼都属于犬科,都会吃方法,但不管吃啥,所以把吃方法定义为犬科类的一个抽象方法,它们都会跑,所以吧跑定义为犬科类的非抽象方法,狗和狼继承了犬科就必须实现吃的方法,而吃什么自己定义方法体覆盖;但是跑方法都一样,所以他们全部具有,不需要在定义。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马