JAVA之接口

2022-08-28  本文已影响0人  每天进步一点点变成更好的自己

1、接口的概念

import java.util.Date;
// >> TODO 接口的定义使用interface,而非class
// >> TODO 接口中的方法,就是这个类型的规范,接口专注于规范,怎么实现这些规范,它不管
// >> TODO 接口无法被实例话,也就是不可以new一个接口的实例。
public interface ExpireDateMerchandise {
    // >> TODO 接口里的方法都是public abstract修饰的,方法有名字,参数和返回值,没有方法体,以分号;结束,
    // TODO 接口注释最好写一下
    /**
     * 截止到当前,商品的保质期天数是否超过传递的天数
     *
     * @param days 截止到当前,保质期超过这么多天
     * @return 截止到当前,true如果保质期剩余天数比参数长,false如果保质期不到这多天
     */
    boolean notExpireInDays(int days);

    // >> TODO 因为接口里的方法都是且只能用public abstract修饰,所以这俩修饰符可以省略
    // >> TODO abstract就是抽象方法的修饰符,没有方法体,以分号结束
    /**
     * @return 商品生产日期
     */
    Date getProducedDate();

    /**
     * @return 商品保质期到期日
     */
    public abstract Date getExpireDate();

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


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

    // >> TODO 接口里不能定义局部变量,定义的变量默认都是public static final的,这三个修饰符同样可以省略

    public static final int VAL_IN_INTERFACE = 999;

}

2、接口的使用

import java.util.Date;

// >> TODO 一个类以public class 开头,public class代表这个类是公共类,类名必须和文件名相同。
// >> TODO 一个类以public class后面紧跟类名,然后是一对大括号的类体
    public class jiekoushiyogn implements ExpireDateMerchandise {
    // >> TODO 类体中可以定义描述这个类的属性的变量。我们称之为成员 变量,每个成员变量的定义以;结束
    String name;
    String id;
    int count;

    public boolean notExpireIndays(int days) {
        return false;
    }

    public Date getProducedDate() {
        return null;
    }

    public Date getExpireDate() {
        return null;
    }
}

更详细的如下:

import java.util.Date;
// >> TODO 一个类只能继承一个父类,但是可以实现多个接口
// >> TODO 如果实现的接口里定义了一样的方法,那么也没问题。但是要求方法名,参数,返回值类型都必须一摸一样。
public class GamePointCard extends MerchandiseV2 implements ExpireDateMerchandise, VirtualMerchandise {

    private Date produceDate;
    private Date expirationDate;

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

    // >> TODO 一个类实现接口,就是从接口继承了抽象方法
    public boolean notExpireInDays(int days) {
        return daysBeforeExpire() > days;
    }

    public Date getProducedDate() {
        return produceDate;
    }

    public Date getExpireDate() {
        return expirationDate;
    }

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

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

    private long daysBeforeExpire() {
        long expireMS = expirationDate.getTime();
        long left = expireMS - System.currentTimeMillis();
        if (left < 0) {
            return -1;
        }
        // 返回值是long,是根据left的类型决定的
        return left / (24 * 3600 * 1000);
    }

    private long daysAfterProduce() {
        long expireMS = expirationDate.getTime();
        long left = System.currentTimeMillis() - expireMS;
        if (left < 0) {
            return -1;
        }
        // 返回值是long,是根据left的类型决定的
        return left / (24 * 3600 * 1000);
    }
}

上一篇 下一篇

猜你喜欢

热点阅读