建立 類別 的實例,是透過new運算子呼叫它的 建構子 來完成。
建構子是一種特殊的方法,目的是初始化剛建立的實例。
建構子看起來和一般方法很像,但它沒有回傳型別,而且名稱要與類別名稱相同。
class Library {
private int books;
public Library() {
// Initialize the books field
this.books = 10;
}
}
// This will call the constructor
var library = new Library();
和一般方法一樣,建構子也可以有參數。 建構子的參數通常會存成(私有的)欄位,方便之後取用,或是用於某些一次性的計算。 引數可以像傳給一般方法那樣,傳給建構子。
class Building {
private int numberOfStories;
private int totalHeight;
public Building(int numberOfStories, double storyHeight) {
this.numberOfStories = numberOfStories;
this.totalHeight = numberOfStories * storyHeight;
}
}
// Call a constructor with two arguments
var largeBuilding = new Building(55, 6.2);
在這個練習中,你要籌辦各種遙控車之間的比賽。每台車都有自己的速度和電池耗電特性。
車子一開始的電池都是全滿的(100%)。每當你用遙控器駕駛車子,車子就會前進相當於車速的距離(以公尺為單位),並將剩餘電量百分比扣掉電池耗電量。
如果車子的電量低於電池耗電量百分比,就無法再駕駛這台車。
每條賽道都有自己的距離。測試車子的方式,是檢查它能否在電力耗盡前跑完賽道。
你總共有六項任務,每一項都會操作遙控車實例。
為NeedForSpeed類別定義一個建構子,接受車速(以公尺為單位)和電池耗電量百分比這兩個參數(型別皆為int),就能建立遙控車:
int speed = 5;
int batteryDrain = 2;
var car = new NeedForSpeed(speed, batteryDrain);
為RaceTrack類別定義一個建構子,接受賽道距離(以公尺為單位)作為唯一的參數(型別為int),就能建立賽道:
int distance = 800;
var raceTrack = new RaceTrack(distance);
實作NeedForSpeed.drive()方法,根據車速更新已行駛的公尺數。另外,實作NeedForSpeed.distanceDriven()方法,回傳車子已行駛的公尺數:
int speed = 5;
int batteryDrain = 2;
var car = new NeedForSpeed(speed, batteryDrain);
car.drive();
car.distanceDriven();
// => 5
修改NeedForSpeed.drive()方法,根據車子的電池耗電量扣除電量。另外,實作NeedForSpeed.batteryDrained()方法,指出電池是否已耗盡到無法行駛:
int speed = 5;
int batteryDrain = 2;
var car = new NeedForSpeed(speed, batteryDrain);
car.drive();
car.batteryDrained();
// => false
最暢銷的遙控車是 Nitro,最高時速高達 50 公尺,電池耗電量為 4%。實作(靜態的)NeedForSpeed.nitro()方法以回傳這款車:
var car = NeedForSpeed.nitro();
car.drive();
car.distanceDriven();
// => 50
車子必須能跑完比賽的距離,才算完成比賽。也就是說,在越過終點線之前,電力不能耗盡。實作RaceTrack.canFinishRace()方法,接受一個NeedForSpeed實例作為參數,若車子能跑完比賽就回傳true,否則回傳false:
int speed = 5;
int batteryDrain = 2;
var car = new NeedForSpeed(speed, batteryDrain);
int distance1 = 100;
var race1 = new RaceTrack(distance1);
int distance2 = 300;
var race2 = new RaceTrack(distance2);
race1.canFinishRace(car);
// => true
race2.canFinishRace(car);
// => false