1、接口的概念
- TODO 接口的定义使用interface,而非class
- TODO 接口中的方法,就是这个类型的规范,接口专注于规范,怎么实现这些规范,它不管
- TODO 接口无法被实例话,也就是不可以new一个接口的实例。
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);
}
}
网友评论