Java 中最主要的物件導向建構是_類別_,它結合了資料(欄位)與行為(方法)。 類別的欄位與方法合稱為它的_成員_。
成員的存取可以透過存取修飾子來控制,最常見的兩種是:
public:任何程式碼都可以存取這個成員(沒有限制)。private:只有同一個類別裡的程式碼可以存取這個成員。你可以把類別想成用來建立該類別實例的範本。
要建立類別的實例(也稱為_物件_),會使用new關鍵字:
class Car {
}
// Create two car instances
Car myCar = new Car();
Car yourCar = new Car();
欄位具有型別和名稱(以 camelCase 命名),可以定義在類別中的任何位置(依慣例以 PascalCase 命名):
class Car {
// Accessible by anyone
public int weight;
// Only accessible by code in this class
private String color;
}
你可以選擇性地為欄位指定初始值。 如果欄位_沒有_指定初始值,它會被設成型別的預設值。 實例的欄位值可以使用點記法存取與更新。
class Car {
// Will be set to specified value
public int weight = 2500;
// Will be set to default value (0)
public int year;
}
Car newCar = new Car();
newCar.weight; // => 2500
newCar.year; // => 0
// Update value of the field
newCar.year = 2018;
私有欄位通常會因為呼叫方法時的副作用而被更新。
這類方法通常不會回傳任何值,此時回傳型別應該是void:
class CarImporter {
private int carsImported;
public void importCars(int numberOfCars)
{
// Update private field from public method
carsImported = carsImported + numberOfCars;
}
}
在這道練習裡,你會玩到一台遙控車,這是你終於存夠錢買下的。
車子一開始的電池是滿的(100%)。每次你用遙控器開動車子,它就會前進 20 公尺,並消耗 1% 的電池電量。
這台遙控車有個酷炫的 LED 顯示器,會顯示兩項資訊:
"Driven <METERS> meters"。"Battery at <PERCENTAGE>%"。如果電池電量是 0%,你就不能再開這台車了,電池顯示器會顯示 "Battery empty"。
你有六個任務,每個任務都會用到遙控車的實例。
實作(static)JedliksToyCar.buy() 方法,回傳一台全新的遙控車實例:
JedliksToyCar car = JedliksToyCar.buy();
實作 JedliksToyCar.distanceDisplay() 方法,回傳 LED 顯示器上顯示的距離:
JedliksToyCar car = JedliksToyCar.buy();
car.distanceDisplay();
// => "Driven 0 meters"
實作 JedliksToyCar.batteryDisplay() 方法,回傳 LED 顯示器上顯示的電池百分比:
JedliksToyCar car = JedliksToyCar.buy();
car.batteryDisplay();
// => "Battery at 100%"
實作 JedliksToyCar.drive() 方法,更新行駛的公尺數:
JedliksToyCar car = JedliksToyCar.buy();
car.drive();
car.drive();
car.distanceDisplay();
// => "Driven 40 meters"
更新 JedliksToyCar.drive() 方法,讓它一併更新電池百分比:
JedliksToyCar car = JedliksToyCar.buy();
car.drive();
car.drive();
car.batteryDisplay();
// => "Battery at 98%"
更新 JedliksToyCar.drive() 方法,讓它在電池耗盡(0%)時不會增加行駛的距離,也不會減少電池百分比:
JedliksToyCar car = JedliksToyCar.buy();
// Drain the battery
// ...
car.distanceDisplay();
// => "Driven 2000 meters"
car.batteryDisplay();
// => "Battery empty"