介面是一種型別,包含定義一組相關功能的成員。它將類別的使用與實作分離,允許多種不同的實作,或支援某些泛型行為,例如格式化、比較或轉換。
介面的語法與類別相似,差別在於方法只以簽章的形式出現,不提供主體。
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