BitNeBolt
@BitNeBolt

Обязателен ли инициализатор у дочернего класса?

Обязателен ли инициализатор при создании дочернего класса?
Например, есть класс Animal(принимает имя и возраст), а класс Dog его расширяет, но принимает те же параметры.
На питоне это будет выглядеть так:
class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

class Dog(Animal):
    def voice(self):
        print("GAV")

d = Dog('Sharik', 4)
d.voice()

Для класса Dog прописывать инициализатор второй раз не нужно.

На Java примерно тоже самое выглядит так:
package Alive;

public class Animal{
    String name;
    int age;

    public Animal(){
        this.name = name;
        this.age = age;
    }

    public void voice() {
        System.out.println("I'm talking");
    }

    public void hello() {
        System.out.println("Hello");
    }
}

и кошка вместо собаки
package Alive;

public class Cat extends Animal{
    public Cat(String name, int age) {
    }

    public void voice() {
        System.out.println("MEW");
    }
}


Можно ли каким-то способом избежать написания
public Cat(String name, int age) {
    }
?
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
@frozen_coder
Java-developer
Во-первых, ваш конструктор в Animal не имеет смысла в том виде, в котором вы его привели - без аргументов вы просто поля класа переприсвоили сами в себя, наверно вы забыли написать аргументы у контруктора name и age.
Во-вторых, Александр Варакосов неправ и контрукторы не наследуются.

В java есть конструкторы по-умолчанию - контруктор без агрументов. Он создается компилятором автоматически, если у класса не объявлено ни одного конструктора.
В конструкторах дочерних классов компилятор сам вставляет первой строкой вызов родительского контруктора по умолчанию, при наличии такового в родительском классе. Т.о. если у дочернего класса нужно в конструкторе просто вызывать конструктор родителя по умолчанию, то в дочернем классе можно явно не объявлять никакой контруктор. А вот если у родителя нет конструктора без аргументов, то объявлять конструктор в дочернем классе необходимо, хотя бы чтобы вызвать в нём родительский конструктор.

P.S. и ещё прочитайте про модификаторы доступа. В java принято поля делать private + getter/setter по необходимости. Вообще, возьмите какой-нибудь учебник по java, там всё расписано
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы