28、接口

2021-04-12  本文已影响0人  爱学习的代代

场景①:商品中有些商品比如大米,酱油等是有保质期的(有些商品没有保质期,比如杯子,碗等),那么我们需要一些商品继承保质期相关的属性和方法。

场景②、商品中有些商品是有虚拟的,比如你买了话费充值卡、购物卡(仅支持在华联超市消费)等,那么我们定义的类也需要继承虚拟商品特有的一些属性等。

据我们了解Java是不支持多继承的。那么怎么办呢?

有时候必须从几个类中派生出一个子类,继承它们的所有属性和方法。但是Java不支持多重继承。有了接口,就可以得到多重继承的效果。

一、接口是什么?

接口是抽象方法和常量值定义的集合

说明:从本质上讲接口是一个特殊的抽象类,这种抽象类中仅定义常量和方法,而不关心变量和方法的实现。

二、定义及使用
package day15;
import java.util.Date;

public interface ExpireDateMerchandise {
// 接口使用interface关键词声明

// 接口中的方法,就是这个类型的规范,接口专注于规范,怎么实现这些规范,它不管。

// 接口无法被实例化

    /**
     *
     * @param days 截止到当前,保质期超出这么多天。
     * @return 截止到当前,true表示保质期剩余天数大于参数,false表示保质期没有那么长了。
     */
//  接口里的方法都是通过 public abstract修饰的,方法有名字,参数和返回值。没有方法体,以;号结束。
    boolean notExpireInDays(int days);

    /**
     *
     * @return 商品生产日期
     */
    Date getProduceDate();

    /**
     *
     * @return 商品到期日期
     */
    Date getExpireDate();

    /**
     *
     * @return  截止到当前,剩余保质期还剩下总保质期长度的百分比
     */
    double leftDatePercentage();

    /**
     * 根据剩余的有效百分比,得出商品现在实际的价值
     * @param leftDatePercentage  剩余有效期百分比
     * @return
     */
    double actualValueNow(double leftDatePercentage);

}

说明:

  1. 使用interface关键词声明接口
  2. 接口中的方法,就是这个类型的规范,接口只定义规范,怎么实现由具体的类来实现。
  3. 接口中的方法要写好注释
  4. 接口无法被实例化
  5. 一个类实现接口 通过implements 接口1, 接口2 声明
  6. 具体的类中要实现接口中定义的方法
package day15;


import java.util.Date;

//一个类只能继承一个类,但是可以实现多个接口
public class GamePointCard extends MerchandiseV2 implements ExpireDateMerchandise, VirtualMerchandise {

    private Date produceDate;
    private Date expirationDate;

    public GamePointCard(int id,  String name, int count, double soldPrice, double purchasePrice, Date produceDate, Date expirationDate) {
        super(id, name, count, soldPrice, purchasePrice);
        this.expirationDate = expirationDate;
        this.produceDate = produceDate;
    }

    public boolean notExpireInDays(int days) {
        return daysBeforeExpire() > days;
    }

    public Date getProduceDate() {
        return produceDate;
    }

    public Date getExpireDate() {
        return expirationDate;
    }

    public double leftDatePercentage() {
        return 1.0 * daysBeforeExpire() / (daysAfterProduce() + daysBeforeExpire());
    }

    public double actualValueNow(double leftDatePercentage) {
        return soldPrice;
    }

    private long daysBeforeExpire() {
        long expireMS = expirationDate.getTime();
        long left = expireMS - System.currentTimeMillis();
//      过期了
        if (left < 0) {
            return -1;
        }
        return left / (24 * 3600 * 1000);
    }

    private long daysAfterProduce(){
        long produceMS = produceDate.getTime();
        long left = System.currentTimeMillis() - produceMS;
        if (left < 0) {
            return -1;
        }

        return left / (24 * 3600 * 1000);
    }



}

上一篇 下一篇

猜你喜欢

热点阅读