_クラス_のインスタンスを作るには、new演算子を使ってその_コンストラクター_を呼び出します。コンストラクターは、新しく作られたインスタンスを初期化することを目的とした特別な種類のメソッドです。コンストラクターは普通のメソッドと似ていますが、戻り値の型がなく、名前がクラス名と一致します。
class Library {
private int books;
public Library() {
// Initialize the books field
this.books = 10;
}
}
// This will call the constructor
var library = new Library();
普通のメソッドと同じように、コンストラクターは仮引数を持つことができます。コンストラクターの仮引数は、ふつうはあとで参照するために(privateな)フィールドとして保存されるか、一度きりの計算に使われます。実引数は、普通のメソッドに渡すときと同じように、コンストラクターにも渡すことができます。
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%)のバッテリーでスタートします。ラジコンで車を走らせるたびに、車は速度の分だけメートル進み、バッテリー残量はバッテリー消費の割合だけ減ります。
車のバッテリーがバッテリー消費の割合を下回ると、その車はもう走らせられません。
それぞれのレースコースには距離があります。車のテストでは、バッテリーを切らすことなくコースを完走できるかどうかを確認します。
タスクは6つあり、それぞれでラジコンカーのインスタンスを扱います。
NeedForSpeedクラスのコンストラクターを定義して、ラジコンカーを作成できるようにしましょう。このコンストラクターは、車の速度(メートル)とバッテリー消費の割合を2つのパラメーターとして受け取ります(どちらも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%です。staticな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