как наследовать конструктор от суперкласса до подкласса - PullRequest
36 голосов
/ 23 февраля 2010

Как наследовать конструктор от суперкласса до подкласса?

Ответы [ 6 ]

47 голосов
/ 23 февраля 2010

Конструкторы не наследуются, вы должны создать новый, идентично прототипированный конструктор в подклассе, который отображается на соответствующий ему конструктор в суперклассе.

Вот пример того, как это работает:

class Foo {
    Foo(String str) { }
}

class Bar extends Foo {
    Bar(String str) {
        // Here I am explicitly calling the superclass 
        // constructor - since constructors are not inherited
        // you must chain them like this.
        super(str);
    }
}
13 голосов
/ 08 сентября 2012

Конструктор суперкласса НЕ МОЖЕТ наследоваться в расширенном классе. Хотя его можно вызвать в конструкторе расширенного класса с помощью super () в качестве первого оператора.

5 голосов
/ 23 февраля 2010

Конструкторы по умолчанию - открытые конструкторы без аргументов (объявленных или подразумеваемых) - наследуются по умолчанию. Вы можете попробовать следующий код для примера этого:

public class CtorTest {
    public static void main(String[] args) {
        final Sub sub = new Sub();
        System.err.println("Finished.");
    }

    private static class Base {
        public Base() {
            System.err.println("In Base ctor");
        }
    }

    private static class Sub extends Base {
        public Sub() {
            System.err.println("In Sub ctor");
        }
    }
}

Если вы хотите явно вызвать конструктор из суперкласса, вам нужно сделать что-то вроде этого:

public class Ctor2Test {
    public static void main(String[] args) {
        final Sub sub = new Sub();
        System.err.println("Finished.");
    }

    private static class Base {
        public Base() {
            System.err.println("In Base ctor");
        }

        public Base(final String toPrint) {
            System.err.println("In Base ctor.  To Print: " + toPrint);
        }
    }

    private static class Sub extends Base {
        public Sub() {
            super("Hello World!");
            System.err.println("In Sub ctor");
        }
    }
}

Единственное предостережение в том, что вызов super () должен идти в качестве первой строки вашего конструктора, иначе компилятор рассердится на вас.

3 голосов
/ 23 февраля 2010

Прочтите о супер-ключевом слове (прокрутите вниз конструкторы подкласса). Если я понимаю ваш вопрос, вы, вероятно, хотите вызвать конструктор суперкласса?

Стоит отметить, что компилятор Java автоматически вставит вызов конструктора без аргументов в суперкласс, если вы явно не вызовете конструктор суперкласса.

1 голос
/ 22 декабря 2015

Вы наследуете атрибуты класса, а не конструкторы классов. Вот как это происходит:

Если конструктор не добавлен в суперкласс, если нет, компилятор добавляет конструктор без аргументов. Этот конструктор по умолчанию вызывается неявно при создании нового экземпляра подкласса. Здесь подкласс может иметь или не иметь конструктор, все в порядке.

если в суперклассе предусмотрен конструктор, компилятор увидит, является ли он конструктором без аргументов или конструктором с параметрами.

если аргументов нет, компилятор вызовет его для любого экземпляра подкласса. Здесь также подкласс может иметь или не иметь конструктор, все в порядке.

если 1 или более конструкторов в родительском классе имеют параметры, а конструктор args отсутствует, то у подкласса должен быть хотя бы 1 конструктор, в котором неявный вызов для конструкции родительского класса выполняется через super (parent_contractor params). 1009 *

Таким образом, вы уверены, что унаследованные атрибуты класса всегда создаются.

1 голос
/ 23 февраля 2010

Скажите, если у вас есть

/**
 * 
 */
public KKSSocket(final KKSApp app, final String name) {
    this.app = app;
    this.name = name;
    ...
}

тогда подкласс с именем KKSUDPSocket, расширяющий KKSSocket, может иметь:

/**
 * @param app
 * @param path
 * @param remoteAddr
 */
public KKSUDPSocket(KKSApp app, String path, KKSAddress remoteAddr) {
    super(app, path, remoteAddr);
}

и

/**
 * @param app
 * @param path
 */
public KKSUDPSocket(KKSApp app, String path) {
    super(app, path);
}

Вы просто передаете аргументы вверх по цепочке конструктора, как вызовы методов для суперклассов, но используете super (...), который ссылается на конструктор суперкласса и передает данные аргументы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...