【问题标题】:Implicit super constructor Seat() is undefined. Must explicitly invoke another constructor隐式超级构造函数 Seat() 未定义。必须显式调用另一个构造函数
【发布时间】:2023-04-08 00:34:01
【问题描述】:

我已经阅读了与此主题相关的其他一些问题,老实说,我对所提供的答案感到非常迷茫,而我确实理解的那些似乎不起作用。

我正在介绍 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 "";
            }
        }
    }
}

【问题讨论】:

  • 当前代码没有编译错误。虽然它会抛出一个NPE,但这是次要的。发布代码 sn-p 它实际上显示了您在问题中提到的错误。
  • 您的 CIDE 充满了错误。这是其他人没有提到的另一个:你的座位阵列的尺寸没有意义
  • 我感觉我们在这里没有看到所有相关代码......我猜你有一个 Seat 的子类,你没有向我们展示。

标签: java eclipse


【解决方案1】:

虽然你的代码不会有这样的编译错误。我将澄清问题标题的答案:

只要有继承,并且创建了子类的对象,子类的构造函数就会调用层次结构中所有超类的构造函数。(直到 Object)默认情况下,它调用一个无参数的构造函数。 (提醒一下,如果你没有定义任何构造函数,jvm会生成一个no-arg,但如果你定义了,jvm不会提供任何,你必须提供。)

如果您在超类中提供了除无参数构造函数之外的任何其他构造函数,则期望无参数构造函数的子类将无法找到它,因为您既没有定义也没有 jvm 将提供其他构造函数存在的 bcz。

为避免这种情况,您有两个选择,要么在超类中使用无参数构造函数,要么使用 super 从子类构造函数中调用任何现有的 super 构造函数。

subClass(){
super(<params>)
}

【讨论】:

  • 我在 OP 发布的代码中没有看到 INHERITANCE。 OP 也没有在 QUESTION-STATEMENT 中提到这一点。
【解决方案2】:

虽然您没有在问题中提供任何此类信息,但我会抓住机会。

我猜你有一个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);
    } 
}

【讨论】:

    【解决方案3】:

    您已经定义了一个构造函数Seat(int)。默认情况下,Java 将有一个无参数构造函数Seat(),以防万一没有定义构造函数。由于您已经定义了一个,因此您还必须定义一个无参数构造函数Seat(),以防您从代码的任何部分调用 Seat() 此外,if (isReserved = false) 会将false 分配给isReserved。始终使用 == (或 equals() 视情况进行比较)。这里,既然是布尔值,你应该使用if (!isReserved)

    编辑:基于 cmets,删除了提到在数组定义上创建 obj 的部分

    【讨论】:

    • seats = new Seat[FC_ROWS][ECONOMY_COLS]; 不会调用任何Seat 构造函数(带或不带参数)。
    • R.J 那么我该如何解决这个问题呢?
    • 好吧,由于某种原因,isReserved 错误修复了该错误,尽管我的东西不起作用,该错误至少消失了。谢谢
    • 您不需要默认构造函数来创建数组。恕我直言,这不应该是一个公认的答案。
    猜你喜欢
    • 2014-06-17
    • 2020-09-29
    • 2014-11-06
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多