Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
61 / 61 / 19
Регистрация: 06.09.2013
Сообщений: 236
Записей в блоге: 1

Конструкторы в наследовании

04.04.2014, 23:13. Показов 3009. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

Столкнулся с некоторой проблемой в области конструкторов в наследовании. Насколько я понял, конструкторы - это некоторые инструкции, которые выполняются перед созданием объекта. Сначала формируются родительские части объекта, потом сама дочерняя часть, соответственно с вызовом конструкторов.

Каждый дочерний конструктор при вызове немедленно вызывает конструктор родителя. Он помещает его во фрейм на вершине стека. Наглядно как-то так:

Java
1
2
3
4
5
class Cat extends Animal {
    public Cat() {
        super(); // Создается компилятором в каждом конструкторе
    }
}
Создал 2 класса - Animal и Cat. Cat расширяет Animal, значит в объекте Cat будет формироваться часть Animal. Один из конструкторов Cat передает аргумент в конструктор Animal, который передает это значение в переменную экземпляра (приватную).

Теперь ближе к вопросу. Когда я попытался создать конструктор без аргументов в классе Cat, а в классе Animal дефолтного не было, IDE все подчеркнула красным и сказала - плохо. Хорошо, как я понял - если дефолтного конструктора нет в родительском классе, то и оператор super() вызывать будет пустую функцию, что не имеет смысла. Далее вещь еще более странная. Ладно, создал в Animal конструктор дефолтный, как заглушку. Далее, в классе Cat создал конструктор, который должен инициализировать тип (целочисленная переменная). Все было хорошо до того момента, пока я не удалил дефолтный конструктор в классе Animal, и в классе Cat получил красные поля в области конструкторов дефолтного и инициализирующего тип.

Весь код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
abstract class Animal {
    private String name;
 
    public Animal(String name) {
        if(!name.equals(null)) {
            this.name = name;
        }
    }
 
    public Animal() {
 
    }
 
    public String getName() {
        return name;
    }
}
 
class Cat extends Animal {
    private int size;
    private int type;
 
    public Cat(String name) {
        super(name);
    }
 
    public Cat() {
        super();
    }
 
    public Cat(int type) {
        this.type = type;
    }
}
Кто-нибудь может мне объяснить, почему от дефолтного конструктора в родительском классе зависят другие конструкторы в классе дочернем? И почему при вызове родительского конструктора и передачи аргумента в него же, эта проблема исчезает?

Добавлено через 13 минут

________________________________________ ________________________________________ ___

Ответ ниже:
________________________________________ ________________________________________ ___


Вупс, сам спросил, сам дал ответ и запутался. Теперь объяснение.

Каждый дочерний конструктор немедленно вызывает родительский. Почему? Потому что если мы не используем оператор super() для вызова конкретного конструктора родительского класса, компилятор делает это так:

Java
1
2
3
4
5
class Cat extends Animal {
    public Cat() {
        super(); // Создается компилятором в каждом конструкторе
    }
}
Собственно, выполняя данный конструктор:

Java
1
2
3
    public Cat(int type) {
        this.type = type;
    }
Компилятор посмотрит, что мы сами не используем super() для вызова конкретного конструктора род. класса и добавит это таким образом:

Java
1
2
3
4
    public Cat(int type) {
        super(); // Ищет конструктор [B]Animal()[/B]
        this.type = type;
    }
Но меня смутило, что конструктор :

Java
1
2
3
    public Cat(String name) {
        super(name);
    }
Который передает аргумент в конструктор Animal :

Java
1
2
3
4
5
    public Animal(String name) {
        if(!name.equals(null)) {
            this.name = name;
        }
    }
Смутило, что этот конструктор не подчеркнуло. Почему? Потому что я сам выбрал какой конструктор родительского класса нужно поместить во фрейм на вершине стека.

Вот и все. Всем спасибо! xD
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2014, 23:13
Ответы с готовыми решениями:

Определите класс матриц. Напишите перегруженные конструкторы для создания одномерной и двумерной матриц. В конструкторы передаются размерности матриц
Доброго времени суток всем) Извините если не в том разделе) Не могу понять как решить данную задачу "(Определите класс матриц....

Ошибка в наследовании
Столкнулся с такой проблемой: Error:(375, 13) java: constructor Canvas6 in class Canvas6 cannot be applied to given types; required:...

Ошибка при наследовании
Помогите разобраться в следующем: Есть 2 класса Flight и Route, которые реализуют интерфейс Entity. Еще есть класс View, конcтруктор...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.04.2014, 23:13
Помогаю со студенческими работами здесь

Массив объектов при наследовании
Есть классы Планета и Материк,который наследуется от Планеты public class Planet { String name; public Planet(String n){ ...

Не вызываются методы при наследовании ArrayList
Здравствуйте. Столкнулся с непонятным мне поведением ArrayList. Если унаследовать класс ArrayList, то не получается получить доступ к...

Правильное написание конструктора при наследовании
В общем вот проблема Есть класс: private class MyBtn extends JButton { public MyBtn() { my_index = 1; my_name =...

Конструкторы
Здравствуйте, есть код: class B { static { System.out.println("B1"); } { System.out.println("B2"); ...

Конструкторы
Ребят , помогите ! Я написал код на java : public class vera3 { public vera2(){ System.out.println...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru