Зачем мне нужен другой конструктор в расширенном абстрактном классе?

Я столкнулся с этой проблемой, и мне интересно, в чем здесь разница:

abstract class Abstract {
    Abstract() {
        System.out.println("Abstract.Abstract()");
    }

    Abstract(String s) {
        System.out.println("Abstract.Abstract(String)");
    }

    void test() {
        System.out.println("Abstract.test()");
    }

    void test(String s) {
        System.out.println("Abstract.test(s)");
    }
}

abstract class Base extends Abstract {
}

class Sub extends Base {
    Sub(String s) {
        super(s);   // undefined constructor
    }

    void subTest(String s) {
        super.test(s);  // why is this all right then?
    }
}

Почему мне нужно определять конструктор Base(String s), чтобы он был компилируемым, но вызов super.test(s) прекрасен, ничего не определяя?


person Miro Kropacek    schedule 23.01.2016    source источник


Ответы (2)


Java предоставляет вам конструкторы по умолчанию в любом классе (даже если вы не определяете его самостоятельно), что означает, что у вас есть Base() конструктор по умолчанию в классе Base, но не любой другой конструктор (тот, который принимает аргументы, например as Base(String s)) , поскольку конструкторы не наследуются.

Кроме того, расширение класса дает вам его методы через наследование, поэтому вызов super.test(s) здесь допустим, потому что Base имеет метод test(String s), унаследованный от Abstract.

person Idos    schedule 23.01.2016

Поскольку Base определяет только один конструктор, по умолчанию no-args вызывает конструктор суперкласса no-args.

Теперь, какие cunstructors суперкласса доступны для Sub? Только один.

person Tassos Bassoukos    schedule 23.01.2016