Конструктор на базов клас

Основи на Java

05 септември 2014 17:20

"Има друг нюанс, когато получите грешка при компилация, ако компилаторът вмъкне извикване super() вместо вас и няма такъв конструктор в родителския клас"

Не мога да разбера това изречение по никакъв начин, дори се опитах да го възпроизведа, но не става. Например, има родителски клас без конструктор, има дъщерен клас с конструктор. трябва да има грешка, т.к. компилаторът в дъщерния ще извика празен супер на родителския клас, а родителският клас изобщо няма конструктор. но компилаторът не извежда грешка. Кажете ми какво не съм разбрал? И въобще защо трябва да има грешка, ако в класа няма конструктор, то самият компилатор го генерира по подразбиране празен, нали? Благодаря ти

Променено:05 септември 2014 14:26
05 септември 2014 17:27

Това означава, че родителският клас има конструктор с параметри или частен конструктор - в такива случаи не се създава конструкторът "по подразбиране".

Просто е лош превод.

Променено:05 септември 2014 14:28
05 септември 2014 17:56
Променено:05 септември 2014 14:57
05 септември 2014 18:26

Да, по-точно, децата трябва да имат явен конструктор (вместо скрит), който показва как трябва да се извика родителският конструктор:

Винаги има конструктор, просто не винаги го пишем изрично и затова понякога изглежда, че не съществува.

Променено:05 септември 2014 15:27
05 септември 2014 19:20

- неявните конструктори на всички класове се извикват автоматично (имплицитно), т.к компилаторът автоматично (имплицитно) генерира супер метода в производния клас.

- в класа наследник може да има конструктор с параметри, а в класа родител без параметри.В този случай в производния клас компилаторът автоматично (неявно) ще добави извикване към метода super, който ще извика празния конструктор на родителския клас.

- ако класът наследник има конструктор с параметри, а класът родител има конструктор с параметри, то в класа наследник първо извикваме супер метода с необходимите параметри.

- ако родителският клас има конструктор с параметри, то дъщерните класове също трябва да имат конструктор с параметри, в противен случай компилаторът ще генерира грешка.

изглежда разбира всичко. Благодаря ти

05 септември 2014 21:18

последните два случая не са съвсем правилни:

- ако родителският клас има конструктор с параметри, то дъщерният трябва да има изричен конструктор (със или без параметри - няма значение) - основното е, че той ясно показва как трябва да се инициализира родителският клас с помощта на извикването на super.

Не се опитвайте да го запомните като някаква „мантра“. Ето основната точка, която трябва да разберете:

- конструкторът е необходим, за да се извърши някаква инициализация на този клас, да се зададат някои от полетата му или нещо друго; - ако не се изисква специална инициализация, тогава имплицитният конструктор по подразбиране все още присъства, ефектът му е абсолютно същият като от публичен конструктор без параметри, който не прави нищо (все още инициализира нещо там - ще го разглеждаме така); - когато класовете се наследяват, се оказва, че полученият клас наследява всички свойства от всички предшественици s и всички тези свойства трябва да бъдат предадени инициализирани; - следователно Java машината изисква всички конструктори на всички класове, от които е съставен този потомък, да бъдат извикани "по веригата"; - ако конструктори без параметри участват във веригата, тогава Javaсамата машина разбира как да ги извика. не е необходимо да им се предава нищо и следователно е невъзможно да бъдат извикани "неправилно"; - обаче, ако някои от конструкторите изискват параметри, тогава тези параметри трябва да бъдат зададени изрично - ако това е последният конструктор във веригата, тогава потребителят ще зададе параметрите за него, когато бъде извикан - и ако не е последният, тогава конструкторът-потомък трябва да зададе параметрите за него.