创建 类 的实例,需要通过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