Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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);
    }
}

Ответ 2

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

Ответ 3

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

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() должен начинаться как первая строка вашего конструктора, иначе компилятор будет злиться на вас.

Ответ 4

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

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

Ответ 5

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

/**
 * 
 */
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);
}

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

Ответ 6

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

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

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

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

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

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