在 Java 中运行我的多态性代码示例时遇到问题



我复制了一个自行车示例,想将其更改为汽车示例,但我无法运行PolyCar类的扩展类山地自行车。 如果我注释掉山地自行车,PolyCar就会运行。 谁能告诉我为什么该程序不识别山地自行车

这是用于运行我的PolyCar程序的TestCar程序

//import PolyCar.MountainBike;
//import PolyCar.RoadBike;
public class TestCars {
public static void main(String[] args){
PolyCar bike01, bike02, bike03;
bike01 = new PolyCar(20, 10, 1);
bike02 = new MountainBike(20, 10, 5, "Dual");
//      bike03 = new RoadBike(40, 20, 8, 23);
bike01.printDescription();
bike02.printDescription();
//      bike03.printDescription();
}
}

这是我的保利汽车代码

public class PolyCar {
// the PolyCar class has three fields
public int cadence;
public int gear;
public int speed;
// the PolyCar class has one constructor
public PolyCar(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
// the PolyCar class has four methods
public void setCadence(int newValue) {
cadence = newValue;
}
public void setGear(int newValue) {
gear = newValue;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
public void printDescription(){
System.out.println("nBike is " + "in gear " + this.gear
+ " with a cadence of " + this.cadence +
" and travelling at a speed of " + this.speed + ". ");
}
public class MountainBike extends PolyCar {
private String suspension;
public MountainBike(
int startCadence,
int startSpeed,
int startGear,
String suspensionType){
super(startCadence,
startSpeed,
startGear);
this.setSuspension(suspensionType);
}
public String getSuspension(){
return this.suspension;
}
public void setSuspension(String suspensionType) {
this.suspension = suspensionType;
}
public void printDescription() {
super.printDescription();
System.out.println("The " + "MountainBike has a" +
getSuspension() + " suspension.");
}
} 
public class RoadBike extends PolyCar{
// In millimeters (mm)
private int tireWidth;
public RoadBike(int startCadence,
int startSpeed,
int startGear,
int newTireWidth){
super(startCadence,
startSpeed,
startGear);
this.setTireWidth(newTireWidth);
}
public int getTireWidth(){
return this.tireWidth;
}
public void setTireWidth(int newTireWidth){
this.tireWidth = newTireWidth;
}
public void printDescription(){
super.printDescription();
System.out.println("The RoadBike" + " has " + getTireWidth() +
" MM tires.");
}
}
}

MountainBikeRoadBike封装在PolyCar类中;它们应该在单独的类文件中。您的解决方案非常简单,只需在声明其他两个子类之前移动最后一个大括号以结束PolyCar类。

目前您有:

public class PolyCar
{
...
public class MountainBike extends PolyCar{
...
}
public class RoadBike extends PolyCar{
...
}
}

更改为:

class PolyCar {
...  
} 
class RoadBike extends PolyCar{
....
}
class RoadBike extends PolyCar{
...
}

工作教程此处点示例

您的 PolyCar 类范围内有 MountainBike 和 RoadBike。

合乎逻辑的事情是将它们取出(在 MountainBike 定义之前放一个大括号,并在 RoadBike 类之后删除最后一个大括号(。或者将 MountainBike 和 RoadBike 类设为静态并初始化它们,如 bike02 = new PolyCar.MountainBike(20, 10, 5, "Dual"(;

在我看来,第二种选择是不好的,因为将它们作为嵌套类没有逻辑,因为你试图完成继承和多态性,嵌套代表一种"组合"关系。

最新更新