接口是一种类型,它包含的成员定义了一组相关的功能。它把类的使用与实现分离开来,从而允许存在多种不同的实现,或支持某些通用的行为,比如格式化、比较或转换。
接口的语法与类相似,区别在于方法只以签名出现,不提供方法体。
public interface Language {
String getLanguageName();
String speak();
}
public class ItalianTraveller implements Language, Cloneable {
// from Language interface
public String getLanguageName() {
return "Italiano";
}
// from Language interface
public String speak() {
return "Ciao mondo";
}
// from Cloneable interface
public Object clone() {
ItalianTraveller it = new ItalianTraveller();
return it;
}
}
接口定义的所有操作都必须由实现它的类来实现。
接口通常包含实例方法。
除了上面演示的 Cloneable,Java 类库中还能找到另一个接口的例子:Comparable<T>。当集合中需要默认的泛型排序顺序时,就可以实现 Comparable<T> 接口。
在本练习中,你将进一步处理遥控车相关的工作。
一款实验车已经研发出来,测试赛道需要改造,以便同时容纳量产车型和实验车型。 这两种车都已经造好,你需要想办法让它们在测试赛道上共存。
此外,量产车开始取得一些成绩。 车队老板希望通过公布量产车的排名来保持竞争氛围。
请向RemoteControlCar接口中添加两个方法:
drive(),不返回任何值,以及getDistanceTravelled(),返回一个int。然后让ProductionRemoteControlCar和ExperimentalRemoteControlCar实现RemoteControlCar接口。
这包括实现该接口要求的所有方法。
每次调用.drive()都应让车行驶一段距离:
ProductionRemoteControlCar行驶 10 个单位,ExperimentalRemoteControlCar行驶 20 个单位。.getDistanceTravelled()方法应返回该车自启用以来行驶的总单位数。
ProductionRemoteControlCar prod = new ProductionRemoteControlCar();
prod.drive();
prod.getDistanceTravelled();
// => 10
ExperimentalRemoteControlCar exp = new ExperimentalRemoteControlCar();
exp.drive();
exp.getDistanceTravelled();
// => 20
实现TestTrack.race(RemoteControlCar car)方法,其中的car会执行drive()。
TestTrack.race(new ProductionRemoteControlCar());
TestTrack.race(new ExperimentalRemoteControlCar());
// this should execute without an exception being thrown
请在ProductionRemoteControlCar类中实现Comparable<T>接口。
赛车的默认排序顺序应为按胜利次数降序排列。
实现静态方法TestTrack.getRankedCars(),返回传入的赛车,并按胜利次数降序排列。
ProductionRemoteControlCar prc1 = new ProductionRemoteControlCar();
ProductionRemoteControlCar prc2 = new ProductionRemoteControlCar();
prc1.setNumberOfVictories(2);
prc2.setNumberOfVictories(3);
List<ProductionRemoteControlCar> unsortedCars = new ArrayList<>();
unsortedCars.add(prc1);
unsortedCars.add(prc2);
List<ProductionRemoteControlCar> rankings = TestTrack.getRankedCars(unsortedCars);
// => rankings.get(0) == prc2
// => rankings.get(1) == prc1