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);
}
说明:
- 使用
interface关键词声明接口 - 接口中的方法,就是这个类型的规范,接口只定义规范,怎么实现由具体的类来实现。
- 接口中的方法要写好注释
- 接口无法被实例化
- 一个类实现接口 通过
implements 接口1, 接口2声明 - 具体的类中要实现接口中定义的方法
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);
}
}