看例程:学习接口的定义
看例程:学习接口的实现和接口引用的使用
看例程:学习接口的继承
// >> 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;
}
// >> 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);
}
}
// >> TODO 接口甚至可以没有任何方法的定义,只是规定一种类型
public interface VirtualMerchandise {
}
// >> TODO 接口也可以继承接口。接口可以继承多个接口,接口之间的继承要用extends
// >> TODO 接口不可以继承类
// >> TODO 继承的接口,可以有重复的方法,但是签名相同时,返回值必须完全一样,否则会有编译错误
public interface Intf3 extends Intf1, Intf2{
void m3();
}
接口甚至可以没有任何方法的定义,只是规定一种类型
接口也可以继承接口。接口可以继承多个接口,接口之间的继承要用extends
接口不可以继承类
继承的接口,可以有重复的方法,但是签名相同时,返回值必须完全一样,否则会有编译错误
一个类只能继承一个父类,但是可以实现多个接口
如果实现的接口里定义了一样的方法,那么也没问题。但是要求方法名,参数,返回值类型都必须一摸一样。
一个类实现接口,就是从接口继承了抽象方法
接口的定义使用interface,而非class
接口中的方法,就是这个类型的规范,接口专注于规范,怎么实现这些规范,它不管
接口无法被实例话,也就是不可以new一个接口的实例。
接口里的方法都是public abstract修饰的,方法有名字,参数和返回值,没有方法体,以分号;结束,
接口注释最好写一下
因为接口里的方法都是且只能用public abstract修饰,所以这俩修饰符可以省略
就是抽象方法的修饰符,没有方法体,以分号结束
接口里不能定义局部变量,定义的变量默认都是public static final的,这三个修饰符同样可以省略