由浅入深理解抽象类和接口

抽象类

抽象类的定义

所谓抽象类,是指对某一个类的整体或根源的抽象描述,包括方法和属性

对抽象类的理解
  • 对于抽象类,一般继承的类与被继承的类之间的关系是“is a”的关系,表示被继承的类属于继承类的一部分;
  • 抽象类是不能被实例化;
  • 抽象类中可以有成员变量、抽象方法、构造函数、实体方法,并且抽象方法一般是由protected修饰的;
  • 抽象方法名和抽象类名前必须使用abstract修饰;
  • 抽象类存在的意义在于声明子类中共有的属性和方法,并约定子类应该有的行为;
  • 抽象类可以继承接口,也可以继承另一个抽象类,但是只能一对一的关系,也就是单继承。

接口

接口的定义

所谓接口是指,对一个类的行为的抽象描述

对接口的理解
  • 对于接口,一般是指实现类与类之间具有“has a”的关系,表示实现类具有接口中定义的某种行为;
  • 接口中只能包含抽象方法,一般是不推荐在接口中添加成员变量的;
  • 接口中如果要添加成员变量,一般由public或default修饰,还可以使用static或final,并且必须要赋值;
  • 接口可以继承接口,但是不能被类继承,也不能声明构造函数,属于多继承。

抽象类和接口的区别与选择

  • 抽象类中可以包含抽象方法、成员变量、构造函数、普通方法,一般抽象方法是由protected修饰,而接口只能包含抽象方法,一般成员变量不推荐添加;
  • 抽象类属于单继承,而接口属于多继承;
  • 抽象类中可以含有构造函数,但是接口中不允许包含构造函数;

从设计的角度来理解抽象类和接口

面向对象编程和面向接口编程
  • 面向对象编程和面向接口编程并不是平级的,面向接口编程是附属于面向对象编程,是面向对象编程的核心精髓。
  • 接口,在表面上看,是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被类或其他接口实现。规定了实现本接口的类或接口必须拥有的一组规则。例如,在自然界,人都能行走、吃饭,那么就可以定义一个接口,用来封装一些行走、吃饭的方法,只要实现类中的对象具有这种行为,那么就可以实现这个接口。这也是符合面向对象的思想,将真实世界抽象成类。
    * 接口是在一定粒度视图上同类事物的抽象表示,而这里的“同类事物”是相对的,它是因为粒度视图不同而不同。面向对象思想和核心之一就是多态性,也就是在某个粒度视图层面上对同类事物不加以对待而统一处理。
  • 面向接口编程是在类图设计上需要考虑设计达到隔离和封装的作用,因此在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务,而是通过定义一组接口,仅向上层暴露其接口功能,上层对下层仅仅是接口依赖,而不依赖具体的类。这样做的好处是,首先能增大系统的灵活性,当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改,甚至可以在不修改上层代码时将下层整个替换掉;其次就是可以在使用不同部件或层次模块进行开发,能够提高效率。也可以说“面向接口编程”中的接口是一种思想层面的用于多态性、提高软件灵活性和维护性的架构部件,而具体语言中的“接口”是将这种思想中的部件具体实施到代码里的手段。(此处也只是自己的一点理解,如有错误,)
  • 因此从另一个角度来看是选择接口还是选择抽象类,还需要看你使用的动机,使用抽象类是为了代码的复用,而使用接口的动机在于实现多态性

抽象类和接口使用场景示例

抽象类

交通运输示例:
* 需求:对于汽车、高铁和飞机三种交通运输工具在时间、速度、价格上分别比较三种方式,由用户输入时间、距离、交通运输方式等,自动输出三种交通方式的所需时间、价格等信息。
* 设计类图
这里写图片描述
* 具体实现
抽象类

/**
*   抽象交通类
*/
abstract public class Traffic{
   

    String name;//交通名称

    double startTime;//到车站或机场的时间(分钟)

    double endTime;//从车站或机场到目的地的时间(分钟)

    double getTicket;//取票消耗时间(分钟)

    double securityCheck;//安检时间(分钟)

    double waiting;//候车时间(分钟)

    double speed;//车速(公里/小时)

    double price;//单价(元)

    double allTime;//总时间(分钟)

    double allPrice;//总花费(元)

    /**
    *   计算消耗时间和金钱
    *   @Param distance   距离
    */
    abstract protected void Calculation(double distance);

    /**
    *   输出计算结果
    *   @Param  distance  距离
    */
    public void printResult(double distance){   
        Calculation(distance);
        System.out.println(name+"交通方式,总耗时"+allTime+",总花费"+allPrice);
    }


}

实现类

/**
*   汽车类
*/
public class Car extends Traffic{
   

    /**
    *   计算消耗时间和金钱
    *   @Param distance   距离
    */
    @Override
    protected void Calculation(double distance){

        name = "汽车";
        startTime = 20;
        endTime = 20;
        getTicket = 5;
        securityCheck = 2;
        waiting = 10;
        speed = 70;
        price = 0.32;
        allTime = startTime + endTime + securityCheck + waiting + (distance/speed)*60;
        allPrice = distance*price + 4;
    }
}

/**
*   火车类
*/
public class 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值