在这里,它说:
这为MountainBike提供了与Bicycle相同的所有字段和方法,但允许其代码专注于使其独特的功能.这使您的子类代码易于阅读.但是,您必须注意正确记录每个超类定义的状态和行为,因为该代码不会出现在每个子类的源文件中.
但是在我的代码中,继承不能正常工作,可能是由于我的代码存在缺陷?
package java1;
class bicycle {
int speed = 0;
int gear = 1;
void accelerate(int incr) {
speed = speed + incr;
}
void decelerate(int incr) {
speed = speed - incr;
}
void changeGear(int val) {
gear = val;
}
void printInfo() {
System.out.println("Speed: " + speed + " Gear: " + gear);
}
}
class mountainbike extends bicycle {
int speed = 10;
}
public class Main {
public static void main(String[] args) {
mountainbike mb1 = new mountainbike();
mb1.accelerate(20);
mb1.accelerate(10);
mb1.printInfo();
}
}
Run Code Online (Sandbox Code Playgroud)
山地车类应该继承自行车类的所有特征吧?我添加了一个唯一的属性int speed = 10
,因此启动速度应为10.但是在运行时,编译器会将启动速度视为0.
有任何想法吗?
不,您的Mountainbike
班级不应重新定义speed
变量.您需要将初始speed(10
)传递给其超类的构造函数,super
作为构造函数调用的一部分:
package java1;
class Bicycle
{
Bicycle(int speed, int gear)
{
this.speed = speed;
this.gear = gear;
}
public void accelerate(int incr)
{
speed = speed + incr;
}
public void decelerate(int incr)
{
speed = speed - incr;
}
void changeGear(int val)
{
gear = val;
}
public String toString()
{
return "Speed: " + speed + " Gear: " + gear;
}
private int speed = 0;
private int gear = 1;
}
class Mountainbike extends Bicycle
{
public Mountainbike()
{
super(10, 1);
}
}
public class Main {
public static void main(String[] args)
{
Mountainbike mb1 = new Mountainbike();
mb1.accelerate(20);
mb1.accelerate(10);
System.out.println(mb1);
}
}
Run Code Online (Sandbox Code Playgroud)
我建议不要使用protected
速度和齿轮变量.优良作法是通过声明基类中的speed
和gear
变量来强制执行封装private
.
编辑:
显然,你是从Java编程开始的.我建议你看一下Bruce Eckel写的这本免费在线书:用Java思考.
public class Bicycle {
private int speed;
public Bicycle (int speed) {
this.speed = speed;
}
}
public class Mountainbike extends Bicycle {
public Mountainbike() {
super(10);
}
}
Run Code Online (Sandbox Code Playgroud)