Java подкласс с приватным конструктором дает ошибку компиляции - PullRequest
0 голосов
/ 11 февраля 2020

Можете ли вы помочь мне понять, почему следующий код дает ошибку компиляции? Если я удаляю конструктор Foo2, он работает нормально.

class Foo2 {

    int st;

    protected Foo2(int initialVal) {
        this.st = initialVal;
    }
}

public class Main extends Foo2 {

    int st;

    private Main(int initialVal) {
        this.st = initialVal;
    }

    public static void main(String args[]) {
       Foo2 f = new Main(2);
    }
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

По умолчанию компилятор добавит super() в конструктор подкласса, если вы не добавили

, поэтому в вашем случае родительский класс имеет однопараметрический конструктор, поэтому он не будет вызываться с помощью super()

поэтому вам нужно вызвать super(initialVal), чтобы заставить его работать

, если вы не добавите super(initialVal), тогда вам нужно создать конструктор по умолчанию в родительском классе без параметра, чтобы он мог быть вызванным через super(), который будет добавлен компилятором

0 голосов
/ 11 февраля 2020

Конструктор вашего класса Main неявно вызывает super(). Но поскольку ваш класс Foo2 имеет конструктор с параметрами, компилятор не создает для него конструктор без параметров, поэтому неявный вызов super() недопустим.

Это можно исправить, удалив существующий конструктор Foo2 (как вы сделали) или добавление второго (без параметров) конструктора к Foo2 или добавление вызова super(someIntValue); в качестве первого оператора конструктора Main.

Вот 3-й вариант:

private Main(int initialVal) {
    super(initialVal);
    this.st = initialVal;
}

Конечно, не имеет смысла иметь переменную экземпляра st как в суперклассе Foo2, так и в подклассе Main.

private Main(int initialVal) {
    super(initialVal);
}

будет иметь больше смысла.

...