我已经阅读了一些与此主题相关的其他问题,并且对于所提供的答案实际上很遗憾,而我所理解的答案似乎并不起作用。
我正在介绍ap comp sci课程,这样简单的答案将不胜感激。我的飞机构造函数出错,哪个错误是上面的,不知道如何解决它我尝试使用超级方法,但也许我做错了,因为错误仍然存在。
飞机课程:
public class Airplane {
private Seat[][] seats;
public static final int FIRST_CLASS = 1;
public static final int ECONOMY = 2;
private static final int FC_ROWS = 5;
private static final int FC_COLS = 4;
private static final int ECONOMY_ROWS = 5;
private static final int ECONOMY_COLS = 6;
public Airplane() {
seats = new Seat[FC_ROWS][ECONOMY_COLS];
}
public String toString() {
String str = "";
for (int i = 0; i < FC_ROWS; i++) {
for (int j = 0; j < ECONOMY_COLS; j++) {
str = str + seats[i][j].toString();
}
str += "\n";
}
return str;
}
public class Seat {
private int seatType;
private boolean isReserved;
public static final int WINDOW = 1;
public static final int AISLE = 2;
public static final int CENTER = 3;
public Seat(int inSeatType) {
seatType = inSeatType;
isReserved = false;
}
public int getSeatType() {
return seatType;
}
public void reserveSeat() {
isReserved = true;
}
public boolean isAvailable() {
if (isReserved = false) {
return true;
} else {
return false;
}
}
public String toString() {
if (isReserved == false) {
return "*";
} else {
return "";
}
}
}
}
答案 0 :(得分:2)
虽然你的代码没有这样的编译错误。我将澄清问题标题的答案:
只要有继承,子类&#39;创建了对象,子类的构造函数调用层次结构中所有超类的构造函数。(直到Object)默认情况下,它调用no-arg构造函数。 (提醒一下,如果你没有定义任何构造函数,jvm会生成一个no-arg,但如果你已经定义了,jvm将不提供任何构造函数,你必须提供它。)
如果你在超类中提供了除no-arg构造函数之外的任何其他构造函数,那么期望无参数构造函数的子类将无法找到它,因为你既没有定义也没有jvm将提供存在其他构造函数的bcz。
要避免这种情况,你有两个选择,要么在超类中有一个no-arg构造函数,要么使用super
从子类构造函数中调用super的任何现有构造函数。
subClass(){
super(<params>)
}
答案 1 :(得分:0)
虽然您的问题中没有提供任何此类信息,但我会抓住机会。
我猜你有一个Seat
的子类,你没有向我们展示。由于Seat
没有默认构造函数(没有参数的构造函数),因此在子类的构造函数中,需要显式调用super
调用正确的Seat
构造函数。例如,这不起作用:
public class MySeat extends Seat {
// just an example constructor. Could be a constructor with any arguments
public MySeat() {
// Will not work, since the constructor Seat() does not exist, and Java tries to invoke this constructor if no super call is given.
}
}
相反,你需要做
public class MySeat extends Seat {
// Just an example constructor. Your constructor can take any arguments, but you need to invoke the correct super constructor
public MySeat(int seatType) {
super(seatType);
}
}
答案 2 :(得分:-1)
您已定义了一个构造函数Seat(int)
。默认情况下,如果没有定义构造函数,Java将具有无参数构造函数Seat()
。由于您已经定义了一个,因此如果从代码的任何部分调用Seat(),您还必须定义一个无参数构造函数Seat()
。
此外,if (isReserved = false)
会将false
分配给isReserved
。始终使用==(或equals(),因为可以比较)。这里,因为它是布尔值,所以你应该使用if (!isReserved)
编辑:根据评论,删除了提到数组定义上的obj创建的部分