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 米,并消耗百分之一的电量。
这辆遥控车有一个炫酷的 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"